Base net-virt CLI files on top of which ONOS specific changes will be done
diff --git a/cli/sdncon/extract_model.py b/cli/sdncon/extract_model.py
new file mode 100755
index 0000000..6838352
--- /dev/null
+++ b/cli/sdncon/extract_model.py
@@ -0,0 +1,105 @@
+#
+# Copyright (c) 2013 Big Switch Networks, Inc.
+#
+# Licensed under the Eclipse Public License, Version 1.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+
+#import time
+
+import datetime
+import django.core.management
+
+try:
+ import settings # Assumed to be in the same directory.
+except ImportError:
+ import sys
+ sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
+ sys.exit(1)
+
+django.core.management.setup_environ(settings)
+
+from django.db import models
+from django.db.models.fields import AutoField, BooleanField, IntegerField
+from django.db.models.fields.related import ForeignKey
+
+import sdncon.rest.views
+
+print "# Generated automatically from controller source"
+print "# via tools/extract_model.py date: %s" % datetime.datetime.now().ctime()
+
+# we iterate over rest_name_dict, limiting CLI access to those models
+# and model fields accessible via rest
+
+rest_map = {}
+for (model, model_info) in sdncon.rest.views.rest_model_info_dict.items():
+ rest_map[model] = {}
+ for (rest_field_name, rest_field_info) in model_info.rest_name_dict.items():
+ django_field_name = rest_field_info.name
+ rest_map[model][django_field_name] = rest_field_name
+
+model_info_dict = {}
+for (model, model_info) in sdncon.rest.views.rest_model_info_dict.items():
+ django_model_class = model_info.model_class
+ field_info_dict = {}
+ for (rest_field_name, rest_field_info) in model_info.rest_name_dict.items():
+ django_field_name = rest_field_info.name
+ django_field_info = rest_field_info.django_field_info
+ # now that we have the django info and our own rest info, create a field info to dump
+ json_serialize_string = type(django_field_info) not in (AutoField, BooleanField, IntegerField)
+ field_info = {}
+ field_info['json_serialize_string'] = json_serialize_string
+ if django_field_info.verbose_name != django_field_name:
+ # Check if this is a proxy class
+ if type(django_field_info.verbose_name) is str:
+ field_info['verbose-name'] = django_field_info.verbose_name
+ if django_field_info.primary_key == True:
+ field_info['primary_key'] = True
+ if django_field_info.help_text != "":
+ field_info['help_text'] = django_field_info.help_text
+ field_info['null'] = django_field_info.null
+ if type(django_field_info.default) in [int, bool, str]:
+ field_info['default'] = django_field_info.default
+ field_info['type'] = str(type(django_field_info)).split('.')[-1].replace("'>", "")
+ if field_info['type'] == 'AutoField':
+ # Re-label the cassandra compound key for easier consumption
+ if hasattr(django_model_class, 'CassandraSettings'):
+ cassandra_settings = django_model_class.CassandraSettings
+ if hasattr(cassandra_settings, 'COMPOUND_KEY_FIELDS'):
+ compound_key_fields = cassandra_settings.COMPOUND_KEY_FIELDS
+ rest_key_fields = [rest_map[model].get(x, x) for x in compound_key_fields]
+ field_info['compound_key_fields'] = rest_key_fields
+ field_info['type'] = 'compound-key'
+ field_info['help_text'] = '#|%s' % \
+ '|'.join(rest_key_fields)
+ if field_info['type'] == 'ForeignKey':
+ other_object = django_field_info.rel.to.Rest.NAME
+ if django_field_info.rel.field_name in rest_map[other_object]:
+ field_info['rel_field_name'] = \
+ rest_map[other_object][django_field_info.rel.field_name]
+ else:
+ field_info['rel_field_name'] = django_field_info.rel.field_name
+ field_info['rel_obj_type'] = django_field_info.rel.to.Rest.NAME
+ if field_info['type'] == 'CharField':
+ field_info['max_length'] = django_field_info.max_length
+ #if django_field_info.validators:
+ #field_info['validators'] = django_field_info.validators
+ #if isinstance(type, django.PositiveIntegerField):
+ #type_name = 'PositiveIntegerField'
+ #print type_name
+
+ field_info_dict[rest_field_name] = field_info
+ model_info_dict[model]={'fields':field_info_dict, 'has_rest_model': True}
+
+import pprint
+pp = pprint.PrettyPrinter(indent=2)
+print "model_info_dict = ",pp.pprint(model_info_dict)