CORD-1093: Updated xproto toolchain with numerous bug fixes. Updated
xproto files for documentation. Companion changes in:
https://github.com/sb98052/plyprotobuf
Change-Id: Ia9d8bb72c33c192f2b5d327c4b1243f48d5bb513
diff --git a/xos/genx/targets/django-split.xtarget b/xos/genx/targets/django-split.xtarget
index 07df559..6f43e3b 100644
--- a/xos/genx/targets/django-split.xtarget
+++ b/xos/genx/targets/django-split.xtarget
@@ -1,28 +1,39 @@
-{% for m in proto.messages %}
from header import *
-
-{% if file_exists(m.name|lower+'_header.py') -%}from {{m.name|lower}}_header import *{% endif %}
-
-{% if file_exists(m.name|lower+'_top.py') -%}{{ include_file(m.name|lower+'_top.py') }}{% endif %}
+{% for m in proto.messages %}
+{% if file_exists(xproto_base_name(m.name)|lower+'_header.py') -%}from {{xproto_base_name(m.name)|lower }}_header import *{% endif %}
+{% if file_exists(xproto_base_name(m.name)|lower+'_top.py') -%}{{ include_file(xproto_base_name(m.name)|lower+'_top.py') }} {% endif %}
{%- for l in m.links %}
+
+{% if l.peer != m.name %}
from core.models.{{ l.peer | lower }} import {{ l.peer }}
+{% endif %}
+
{%- endfor %}
+{% for b in m.bases %}
+{% if b!='PlCoreBase' and 'Mixin' not in b%}
+from core.models.{{b | lower}} import {{ b }}
+{% endif %}
+{% endfor %}
+
class {{ m.name }}{{ xproto_base_def(m.bases) }}:
# Primitive Fields (Not Relations)
- {%- for f in m.fields %}
+ {% for f in m.fields %}
+ {%- if not f.link -%}
{{ f.name }} = {{ xproto_django_type(f.type, f.options) }}( {{ xproto_django_options_str(f) }} )
+ {% endif %}
{%- endfor %}
# Relations
- {%- for l in m.links %}
- {{ l.src_port }} = {{ xproto_django_link_type(l) }}( {{ l.peer }}, {{ xproto_django_options_str(l, l.dst_port ) }} )
+ {% for l in m.links %}
+ {{ l.src_port }} = {{ xproto_django_link_type(l) }}( {%- if l.peer==m.name -%}'self'{%- else -%}{{ l.peer }} {%- endif -%}, {{ xproto_django_options_str(l, l.dst_port ) }} )
{%- endfor %}
- {%- if file_exists(m.name|lower + '_model.py') -%}{{ include_file(m.name|lower + '_model.py') | indent(width=2)}}{%- endif %}
+ {% if file_exists(m.name|lower + '_model.py') -%}{{ include_file(m.name|lower + '_model.py') | indent(width=2)}}{%- endif %}
+ pass
-{% if file_exists(m.name|lower+'_bottom.py') -%}{{ include_file(m.name|lower+'_bottom.py') }}{% endif %}
-+++ models/{{m.name|lower}}.py
+{% if file_exists(xproto_base_name(m.name)|lower+'_bottom.py') -%}{{ include_file(xproto_base_name(m.name)|lower+'_bottom.py') }}{% endif %}
++++ {{m.name|lower}}.py
{% endfor %}
diff --git a/xos/genx/targets/django.xtarget b/xos/genx/targets/django.xtarget
index 5dff8d5..66948ff 100644
--- a/xos/genx/targets/django.xtarget
+++ b/xos/genx/targets/django.xtarget
@@ -1,27 +1,34 @@
-{% for m in proto.messages %}
from header import *
-
-{% if file_exists(m.name|lower+'_header.py') -%}from {{m.name|lower}}_header import *{% endif %}
-
-{% if file_exists(m.name|lower+'_top.py') -%}{{ include_file(m.name|lower+'_top.py') }}{% endif %}
+{% for m in proto.messages %}
+{% if file_exists(xproto_base_name(m.name)+'_header.py'|lower) -%}from {{m.name|lower}}_header import *{% endif %}
+{% if file_exists(xproto_base_name(m.name)+'_top.py'|lower) -%}{{ include_file(xproto_base_name(m.name)|lower+'_top.py') }}{% endif %}
{%- for l in m.links %}
from core.models.{{ l.peer | lower }} import {{ l.peer }}
{%- endfor %}
+{% for b in m.bases %}
+{% if b!='PlCoreBase' and b!='AttributeMixin'%}
+from core.models.{{b | lower}} import {{ b }}
+{% endif %}
+{% endfor %}
+
class {{ m.name }}{{ xproto_base_def(m.bases) }}:
# Primitive Fields (Not Relations)
- {%- for f in m.fields %}
+ {% for f in m.fields %}
+ {%- if not f.link -%}
{{ f.name }} = {{ xproto_django_type(f.type, f.options) }}( {{ xproto_django_options_str(f) }} )
+ {% endif %}
{%- endfor %}
# Relations
- {%- for l in m.links %}
+ {% for l in m.links %}
{{ l.src_port }} = {{ xproto_django_link_type(l) }}( {{ l.peer }}, {{ xproto_django_options_str(l, l.dst_port ) }} )
{%- endfor %}
- {%- if file_exists(m.name|lower + '_model.py') -%}{{ include_file(m.name|lower + '_model.py') | indent(width=2)}}{%- endif %}
+ {% if file_exists(m.name|lower + '_model.py') -%}{{ include_file(m.name|lower + '_model.py') | indent(width=2)}}{%- endif %}
-{% if file_exists(m.name|lower+'_bottom.py') -%}{{ include_file(m.name|lower+'_bottom.py') }}{% endif %}
+{% if file_exists(xproto_base_name(m.name)|lower+'_bottom.py') -%}{{ include_file(xproto_base_name(m.name)|lower+'_bottom.py') }}{% endif %}
++++ models/{{m.name|lower}}.py
{% endfor %}
diff --git a/xos/genx/targets/proto.xtarget b/xos/genx/targets/proto.xtarget
index c11c0e8..e310ad4 100644
--- a/xos/genx/targets/proto.xtarget
+++ b/xos/genx/targets/proto.xtarget
@@ -1,8 +1,8 @@
{% for m in proto.messages %}
message {{ m.name }} {
+ option bases = "{{ m.bases | join(",") }}";
{%- for f in m.fields %}
- {{ f.modifier }} {{f.type}} {{f.name}} = {{ f.id }}{% if f.options %} [{% for k,v in f.options.iteritems() %} {{ k }} = {{ v}}{% if not loop.last %},{% endif %} {% endfor %}]{% endif %};
+ {{ f.modifier }} {{f.type}} {{f.name}} = {{ f.id }}{% if f.options %} [{% for k,v in f.options.iteritems() %} {{ k }} = "{{ v}}"{% if not loop.last %},{% endif %} {% endfor %}]{% endif %};
{%- endfor %}
}
-+++ protos/{{ m.name | lower }}.proto
{% endfor %}
diff --git a/xos/genx/tool/lib.py b/xos/genx/tool/lib.py
index a9cff78..0121bd6 100644
--- a/xos/genx/tool/lib.py
+++ b/xos/genx/tool/lib.py
@@ -1,26 +1,41 @@
import pdb
+import re
+
+def xproto_eval(arg):
+ return eval(arg)
def django_content_type_string(xptags):
# Check possibility of KeyError in caller
content_type = xptags['content_type']
+ try:
+ content_type = eval(content_type)
+ except:
+ pass
+
if (content_type=='url'):
return 'URLField'
+ if (content_type=='date'):
+ return 'DateTimeField'
elif (content_type=='ip'):
return 'GenericIPAddressField'
elif (content_type=='stripped' or content_type=='"stripped"'):
return 'StrippedCharField'
-
-def xproto_eval(arg):
- return eval(arg)
+ else:
+ pdb.set_trace()
def django_string_type(xptags):
+ try:
+ max_length = eval(xptags['max_length'])
+ except:
+ max_length = 1024 * 1024
+
if ('content_type' in xptags):
return django_content_type_string(xptags)
- elif ('indexed' not in xptags):
- return 'TextField'
- else:
+ elif (max_length<1024*1024):
return 'CharField'
+ else:
+ return 'TextField'
def xproto_base_def(base):
if (not base):
@@ -51,7 +66,7 @@
return 'ForeignKey'
elif (f['link_type']=='manytomany'):
if (f['dst_port']):
- return 'ManyToManyRelation'
+ return 'ManyToManyField'
else:
return 'GenericRelation'
@@ -59,9 +74,12 @@
if (not d):
return ''
else:
+
lst = []
for k,v in d.items():
- if (type(v)==str and v.startswith('"')):
+ if (type(v)==str and k=='default' and v.endswith('()"')):
+ lst.append('%s = %s'%(k,v[1:-3]))
+ elif (type(v)==str and v.startswith('"')):
try:
tup = eval(v[1:-1])
if (type(tup)==tuple):
@@ -81,7 +99,7 @@
return ', '.join(lst)
def map_xproto_to_django(f):
- allowed_keys=['help_text','default','max_length','modifier','blank','choices','db_index','null']
+ allowed_keys=['help_text','default','max_length','modifier','blank','choices','db_index','null','editable','on_delete','verbose_name']
m = {'modifier':{'optional':True, 'required':False, '_target':'null'}}
out = {}
@@ -96,12 +114,41 @@
return out
+def xproto_django_link_options_str(field, dport=None):
+ output_dict = map_xproto_to_django(field)
+
+ if (dport and (dport=='+' or '+' not in dport)):
+ output_dict['related_name'] = '%r'%dport
+
+ try:
+ if field['through'] and not field['through'].endswith('_'+field.name):
+ output_dict['through'] = field['through']
+ except:
+ pass
+
+ return format_options_string(output_dict)
+
def xproto_django_options_str(field, dport=None):
output_dict = map_xproto_to_django(field)
if (dport=='_'):
dport = '+'
- if (dport):
+ if (dport and (dport=='+' or '+' not in dport)):
output_dict['related_name'] = '%r'%dport
+
return format_options_string(output_dict)
+
+def xproto_base_name(n):
+ # Hack - Refactor NetworkParameter* to make this go away
+ if (n.startswith('NetworkParameter')):
+ return '_'
+
+ expr = r'^[A-Z][a-z]+'
+
+ try:
+ match = re.findall(expr, n)[0]
+ except:
+ return '_'
+
+ return match
diff --git a/xos/genx/tool/xos2jinja.py b/xos/genx/tool/xos2jinja.py
index 2804527..9cbc00a 100644
--- a/xos/genx/tool/xos2jinja.py
+++ b/xos/genx/tool/xos2jinja.py
@@ -81,11 +81,19 @@
s['link_type'] = obj.link_type.pval
s['src_port'] = obj.src_port.value.pval
s['name'] = obj.src_port.value.pval
+
try:
s['dst_port'] = obj.dst_port.value.pval
except AttributeError:
s['dst_port'] = ''
- s['peer'] = obj.name
+
+
+ try:
+ s['through'] = obj.through.pval
+ except AttributeError:
+ s['through'] = ''
+
+ s['peer'] = obj.name.pval
s['_type'] = 'link'
s['options'] = {'modifier':'optional'}
@@ -192,7 +200,11 @@
count = self.count_stack.pop()
messages = []
for i in range(0,count):
- m = self.stack.pop()
+ try:
+ m = self.stack.pop()
+ except IndexError:
+ pdb.set_trace()
+
messages.insert(0,m)
self.messages = messages
diff --git a/xos/genx/tool/xosgen b/xos/genx/tool/xosgen
index 1585e9d..bfecfbe 100755
--- a/xos/genx/tool/xosgen
+++ b/xos/genx/tool/xosgen
@@ -16,15 +16,16 @@
parse = argparse.ArgumentParser(description='XOS code generator')
parse.add_argument('--rev', dest='rev', action='store_true',default=False, help='Convert proto to xproto')
parse.add_argument('--input', dest='input', action='store',default=None, help='Filename in Protobufs')
-parse.add_argument('--output', dest='output', action='store',default=None, help='Output format, corresponding to <output>.yaml file')
+parse.add_argument('--target', dest='target', action='store',default=None, help='Output format, corresponding to <output>.yaml file')
+parse.add_argument('--output', dest='output', action='store',default=None, help='Destination path')
args = parse.parse_args()
def file_exists(name):
- return (os.path.exists(name))
+ return (os.path.exists('attic/'+name))
def include_file(name):
- return open(name).read()
+ return open('attic/'+name).read()
# FIXME: Support templates in the future
#return jinja2.Markup(loader.get_source(env, name)[0])
@@ -44,7 +45,7 @@
ast = parser.parse_string(input,debug=0)
ast.accept(v)
- template_name = os.path.abspath(args.output)
+ template_name = os.path.abspath(args.target)
os_template_loader = jinja2.FileSystemLoader( searchpath=[os.path.split(template_name)[0]])
os_template_env = jinja2.Environment(loader=os_template_loader)
@@ -62,7 +63,8 @@
current_buffer = []
for l in lines:
if (l.startswith('+++')):
- path = l[4:]
+ prefix = args.output.rsplit('/',1)[0]
+ path = prefix+'/'+l[4:]
direc,filename = path.rsplit('/',1)
os.system('mkdir -p %s'%direc)
diff --git a/xos/genx/xprotos/core/account.xproto b/xos/genx/xprotos/core/account.xproto
index 641d7c5..ba24140 100644
--- a/xos/genx/xprotos/core/account.xproto
+++ b/xos/genx/xprotos/core/account.xproto
@@ -1,5 +1,5 @@
-message Account {
+message Account (PlCoreBase){
required manytoone site->Site:accounts = 1 [help_text = "Site for this account", null = False, db_index = True, blank = False];
}
diff --git a/xos/genx/xprotos/core/addresspool.xproto b/xos/genx/xprotos/core/addresspool.xproto
index 7ada9d4..737de26 100644
--- a/xos/genx/xprotos/core/addresspool.xproto
+++ b/xos/genx/xprotos/core/addresspool.xproto
@@ -1,6 +1,6 @@
-message AddressPool {
+message AddressPool (PlCoreBase){
required string name = 1 [db_index = False, max_length = 32, null = False, blank = False];
optional string addresses = 2 [db_index = False, null = True, blank = True];
optional string gateway_ip = 3 [db_index = False, max_length = 32, null = True, blank = False];
diff --git a/xos/genx/xprotos/core/charge.xproto b/xos/genx/xprotos/core/charge.xproto
index 96afeec..df45134 100644
--- a/xos/genx/xprotos/core/charge.xproto
+++ b/xos/genx/xprotos/core/charge.xproto
@@ -1,6 +1,6 @@
-message Charge {
+message Charge (PlCoreBase){
required manytoone account->Account:charges = 1 [db_index = True, null = False, blank = False];
optional manytoone slice->Slice:charges = 2 [db_index = True, null = True, blank = True];
required string kind = 3 [default = "besteffort", choices = "(('besteffort', 'besteffort'), ('reservation', 'reservation'), ('monthlyfee', 'monthlyfee'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/controller.xproto b/xos/genx/xprotos/core/controller.xproto
index c6d3638..da2d1e3 100644
--- a/xos/genx/xprotos/core/controller.xproto
+++ b/xos/genx/xprotos/core/controller.xproto
@@ -1,6 +1,6 @@
-message Controller {
+message Controller (PlCoreBase){
required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the Controller", null = False, db_index = False];
required string backend_type = 2 [max_length = 200, content_type = "stripped", blank = False, help_text = "Type of compute controller, e.g. EC2, OpenStack, or OpenStack version", null = False, db_index = False];
required string version = 3 [max_length = 200, content_type = "stripped", blank = False, help_text = "Controller version", null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/controllerdashboardview.xproto b/xos/genx/xprotos/core/controllerdashboardview.xproto
index 9b8afd2..ed4229c 100644
--- a/xos/genx/xprotos/core/controllerdashboardview.xproto
+++ b/xos/genx/xprotos/core/controllerdashboardview.xproto
@@ -1,6 +1,6 @@
-message ControllerDashboardView {
+message ControllerDashboardView (PlCoreBase){
required manytoone controller->Controller:controllerdashboardviews = 1 [db_index = True, null = False, blank = False];
required manytoone dashboardView->DashboardView:controllerdashboardviews = 2 [db_index = True, null = False, blank = False];
required bool enabled = 3 [default = True, null = False, db_index = False, blank = True];
diff --git a/xos/genx/xprotos/core/controllerimages.xproto b/xos/genx/xprotos/core/controllerimages.xproto
index ecd750b..38d6237 100644
--- a/xos/genx/xprotos/core/controllerimages.xproto
+++ b/xos/genx/xprotos/core/controllerimages.xproto
@@ -1,6 +1,6 @@
-message ControllerImages {
+message ControllerImages (PlCoreBase){
required manytoone image->Image:controllerimages = 1 [db_index = True, null = False, blank = False];
required manytoone controller->Controller:controllerimages = 2 [db_index = True, null = False, blank = False];
optional string glance_image_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Glance image id", null = True, db_index = False];
diff --git a/xos/genx/xprotos/core/controllernetwork.xproto b/xos/genx/xprotos/core/controllernetwork.xproto
index a09cb56..ba6acec 100644
--- a/xos/genx/xprotos/core/controllernetwork.xproto
+++ b/xos/genx/xprotos/core/controllernetwork.xproto
@@ -1,6 +1,6 @@
-message ControllerNetwork {
+message ControllerNetwork (PlCoreBase){
required manytoone network->Network:controllernetworks = 1 [db_index = True, null = False, blank = False];
required manytoone controller->Controller:controllernetworks = 2 [db_index = True, null = False, blank = False];
required string subnet = 3 [db_index = False, max_length = 32, null = False, blank = True];
diff --git a/xos/genx/xprotos/core/controllerrole.xproto b/xos/genx/xprotos/core/controllerrole.xproto
index b6cc629..4ae4bb2 100644
--- a/xos/genx/xprotos/core/controllerrole.xproto
+++ b/xos/genx/xprotos/core/controllerrole.xproto
@@ -1,5 +1,5 @@
-message ControllerRole {
+message ControllerRole (PlCoreBase){
required string role = 1 [choices = "(('admin', 'Admin'),)", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
}
diff --git a/xos/genx/xprotos/core/controllersite.xproto b/xos/genx/xprotos/core/controllersite.xproto
index b016012..6fb4be8 100644
--- a/xos/genx/xprotos/core/controllersite.xproto
+++ b/xos/genx/xprotos/core/controllersite.xproto
@@ -1,6 +1,6 @@
-message ControllerSite {
+message ControllerSite (PlCoreBase){
required manytoone site->Site:controllersite = 1 [db_index = True, null = False, blank = False];
optional manytoone controller->Controller:controllersite = 2 [db_index = True, null = True, blank = True];
optional string tenant_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Keystone tenant id", null = True, db_index = True];
diff --git a/xos/genx/xprotos/core/controllersiteprivilege.xproto b/xos/genx/xprotos/core/controllersiteprivilege.xproto
index e1741e9..ca5ca75 100644
--- a/xos/genx/xprotos/core/controllersiteprivilege.xproto
+++ b/xos/genx/xprotos/core/controllersiteprivilege.xproto
@@ -1,6 +1,6 @@
-message ControllerSitePrivilege {
+message ControllerSitePrivilege (PlCoreBase){
required manytoone controller->Controller:controllersiteprivileges = 1 [db_index = True, null = False, blank = False];
required manytoone site_privilege->SitePrivilege:controllersiteprivileges = 2 [db_index = True, null = False, blank = False];
optional string role_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Keystone id", null = True, db_index = True];
diff --git a/xos/genx/xprotos/core/controllerslice.xproto b/xos/genx/xprotos/core/controllerslice.xproto
index 9df1311..46e15ae 100644
--- a/xos/genx/xprotos/core/controllerslice.xproto
+++ b/xos/genx/xprotos/core/controllerslice.xproto
@@ -1,6 +1,6 @@
-message ControllerSlice {
+message ControllerSlice (PlCoreBase){
required manytoone controller->Controller:controllerslices = 1 [db_index = True, null = False, blank = False];
required manytoone slice->Slice:controllerslices = 2 [db_index = True, null = False, blank = False];
optional string tenant_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Keystone tenant id", null = True, db_index = False];
diff --git a/xos/genx/xprotos/core/controllersliceprivilege.xproto b/xos/genx/xprotos/core/controllersliceprivilege.xproto
index 711e522..c1308dc 100644
--- a/xos/genx/xprotos/core/controllersliceprivilege.xproto
+++ b/xos/genx/xprotos/core/controllersliceprivilege.xproto
@@ -1,6 +1,6 @@
-message ControllerSlicePrivilege {
+message ControllerSlicePrivilege (PlCoreBase){
required manytoone controller->Controller:controllersliceprivileges = 1 [db_index = True, null = False, blank = False];
required manytoone slice_privilege->SlicePrivilege:controllersliceprivileges = 2 [db_index = True, null = False, blank = False];
optional string role_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Keystone id", null = True, db_index = True];
diff --git a/xos/genx/xprotos/core/controlleruser.xproto b/xos/genx/xprotos/core/controlleruser.xproto
index 49f4c99..5560d6d 100644
--- a/xos/genx/xprotos/core/controlleruser.xproto
+++ b/xos/genx/xprotos/core/controlleruser.xproto
@@ -1,6 +1,6 @@
-message ControllerUser {
+message ControllerUser (PlCoreBase){
required manytoone user->User:controllerusers = 1 [db_index = True, null = False, blank = False];
required manytoone controller->Controller:controllersusers = 2 [db_index = True, null = False, blank = False];
optional string kuser_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Keystone user id", null = True, db_index = False];
diff --git a/xos/genx/xprotos/core/dashboardview.xproto b/xos/genx/xprotos/core/dashboardview.xproto
index 93b1bf7..76e4f30 100644
--- a/xos/genx/xprotos/core/dashboardview.xproto
+++ b/xos/genx/xprotos/core/dashboardview.xproto
@@ -1,9 +1,11 @@
-message DashboardView {
+message DashboardView (PlCoreBase){
required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the View", null = False, db_index = False];
required string url = 2 [max_length = 1024, content_type = "stripped", blank = False, help_text = "URL of Dashboard", null = False, db_index = False];
required bool enabled = 3 [default = True, null = False, db_index = False, blank = True];
required string icon = 4 [default = "default-icon.png", max_length = 200, blank = False, help_text = "Icon for Dashboard", null = False, db_index = False];
required string icon_active = 5 [default = "default-icon-active.png", max_length = 200, blank = False, help_text = "Icon for active Dashboard", null = False, db_index = False];
+ required manytomany controllers->Controller/ControllerDashboardView:dashboardviews = 6 [db_index = False, null = False, blank = True];
+ required manytomany deployments->Deployment/DashboardView_deployments:dashboardviews = 7 [help_text = "Deployments that should be included in this view", null = False, db_index = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/deployment.xproto b/xos/genx/xprotos/core/deployment.xproto
index 85a0aa8..779f74d 100644
--- a/xos/genx/xprotos/core/deployment.xproto
+++ b/xos/genx/xprotos/core/deployment.xproto
@@ -1,6 +1,6 @@
-message Deployment {
+message Deployment (PlCoreBase){
required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the Deployment", null = False, db_index = False];
required string accessControl = 2 [default = "allow all", max_length = 200, blank = False, help_text = "Access control list that specifies which sites/users may use nodes in this deployment", null = False, db_index = False];
}
diff --git a/xos/genx/xprotos/core/deploymentprivilege.xproto b/xos/genx/xprotos/core/deploymentprivilege.xproto
index 034cc55..33efc2a 100644
--- a/xos/genx/xprotos/core/deploymentprivilege.xproto
+++ b/xos/genx/xprotos/core/deploymentprivilege.xproto
@@ -1,6 +1,6 @@
-message DeploymentPrivilege {
+message DeploymentPrivilege (PlCoreBase){
required manytoone user->User:deploymentprivileges = 1 [db_index = True, null = False, blank = False];
required manytoone deployment->Deployment:deploymentprivileges = 2 [db_index = True, null = False, blank = False];
required manytoone role->DeploymentRole:deploymentprivileges = 3 [db_index = True, null = False, blank = False];
diff --git a/xos/genx/xprotos/core/deploymentrole.xproto b/xos/genx/xprotos/core/deploymentrole.xproto
index 34f3970..61adab5 100644
--- a/xos/genx/xprotos/core/deploymentrole.xproto
+++ b/xos/genx/xprotos/core/deploymentrole.xproto
@@ -1,5 +1,5 @@
-message DeploymentRole {
+message DeploymentRole (PlCoreBase){
required string role = 1 [choices = "(('admin', 'Admin'),)", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
}
diff --git a/xos/genx/xprotos/core/diag.xproto b/xos/genx/xprotos/core/diag.xproto
index 3570e78..7869f50 100644
--- a/xos/genx/xprotos/core/diag.xproto
+++ b/xos/genx/xprotos/core/diag.xproto
@@ -1,5 +1,5 @@
-message Diag {
+message Diag (PlCoreBase){
required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the synchronizer", null = False, db_index = False];
}
diff --git a/xos/genx/xprotos/core/flavor.xproto b/xos/genx/xprotos/core/flavor.xproto
index cf524ec..d30a7c2 100644
--- a/xos/genx/xprotos/core/flavor.xproto
+++ b/xos/genx/xprotos/core/flavor.xproto
@@ -1,9 +1,10 @@
-message Flavor {
+message Flavor (PlCoreBase){
required string name = 1 [max_length = 32, content_type = "stripped", blank = False, help_text = "name of this flavor, as displayed to users", null = False, db_index = False];
optional string description = 2 [db_index = False, max_length = 1024, null = True, content_type = "stripped", blank = True];
required string flavor = 3 [max_length = 32, content_type = "stripped", blank = False, help_text = "flavor string used to configure deployments", null = False, db_index = False];
required int32 order = 4 [help_text = "used to order flavors when displayed in a list", default = 0, null = False, db_index = False, blank = False];
required bool default = 5 [help_text = "make this a default flavor to use when creating new instances", default = False, null = False, db_index = False, blank = True];
+ required manytomany deployments->Deployment/DashboardView_deployments:flavors = 6 [db_index = False, null = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/image.xproto b/xos/genx/xprotos/core/image.xproto
index a25d5c7..aa24371 100644
--- a/xos/genx/xprotos/core/image.xproto
+++ b/xos/genx/xprotos/core/image.xproto
@@ -1,10 +1,11 @@
-message Image {
+message Image (PlCoreBase){
required string name = 1 [db_index = False, max_length = 256, null = False, content_type = "stripped", blank = False];
required string kind = 2 [default = "vm", choices = "(('vm', 'Virtual Machine'), ('container', 'Container'))", max_length = 30, blank = False, null = False, db_index = False];
required string disk_format = 3 [db_index = False, max_length = 256, null = False, content_type = "stripped", blank = False];
required string container_format = 4 [db_index = False, max_length = 256, null = False, content_type = "stripped", blank = False];
optional string path = 5 [max_length = 256, content_type = "stripped", blank = True, help_text = "Path to image on local disk", null = True, db_index = False];
optional string tag = 6 [max_length = 256, content_type = "stripped", blank = True, help_text = "For Docker Images, tag of image", null = True, db_index = False];
+ required manytomany deployments->Deployment/DashboardView_deployments:images = 7 [help_text = "Select which images should be instantiated on this deployment", null = False, db_index = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/imagedeployments.xproto b/xos/genx/xprotos/core/imagedeployments.xproto
index 48b4e0e..e11fedb 100644
--- a/xos/genx/xprotos/core/imagedeployments.xproto
+++ b/xos/genx/xprotos/core/imagedeployments.xproto
@@ -1,6 +1,6 @@
-message ImageDeployments {
+message ImageDeployments (PlCoreBase){
required manytoone image->Image:imagedeployments = 1 [db_index = True, null = False, blank = False];
required manytoone deployment->Deployment:imagedeployments = 2 [db_index = True, null = False, blank = False];
}
diff --git a/xos/genx/xprotos/core/instance.xproto b/xos/genx/xprotos/core/instance.xproto
index 9dbf715..b411bd4 100644
--- a/xos/genx/xprotos/core/instance.xproto
+++ b/xos/genx/xprotos/core/instance.xproto
@@ -1,6 +1,6 @@
-message Instance {
+message Instance (PlCoreBase){
optional string instance_id = 1 [max_length = 200, content_type = "stripped", blank = True, help_text = "Nova instance id", null = True, db_index = False];
optional string instance_uuid = 2 [max_length = 200, content_type = "stripped", blank = True, help_text = "Nova instance uuid", null = True, db_index = False];
required string name = 3 [max_length = 200, content_type = "stripped", blank = False, help_text = "Instance name", null = False, db_index = False];
@@ -17,4 +17,5 @@
required string isolation = 14 [default = "vm", choices = "(('vm', 'Virtual Machine'), ('container', 'Container'), ('container_vm', 'Container In VM'))", max_length = 30, blank = False, null = False, db_index = False];
optional string volumes = 15 [help_text = "Comma-separated list of directories to expose to parent context", null = True, db_index = False, blank = True];
optional manytoone parent->Instance:instance = 16 [help_text = "Parent Instance for containers nested inside of VMs", null = True, db_index = True, blank = True];
+ required manytomany tags->Tag = 17 [db_index = False, null = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/invoice.xproto b/xos/genx/xprotos/core/invoice.xproto
index fb9b886..7c05a58 100644
--- a/xos/genx/xprotos/core/invoice.xproto
+++ b/xos/genx/xprotos/core/invoice.xproto
@@ -1,6 +1,6 @@
-message Invoice {
+message Invoice (PlCoreBase){
required string date = 1 [db_index = False, null = False, content_type = "date", blank = False];
required manytoone account->Account:invoices = 2 [db_index = True, null = False, blank = False];
}
diff --git a/xos/genx/xprotos/core/library.xproto b/xos/genx/xprotos/core/library.xproto
index 00b7f34..8505547 100644
--- a/xos/genx/xprotos/core/library.xproto
+++ b/xos/genx/xprotos/core/library.xproto
@@ -1,10 +1,4 @@
-message Library {
- required manytoone xos->XOS:loadable_modules = 1 [help_text = "Pointer to XOS", default = "get_xos()", null = False, db_index = True, blank = False];
- required string name = 2 [max_length = 30, content_type = "stripped", blank = False, help_text = "Service Name", null = False, db_index = False];
- optional string base_url = 3 [max_length = 1024, content_type = "stripped", blank = True, help_text = "Base URL, allows use of relative URLs for resources", null = True, db_index = False];
- optional string version = 4 [default = "1.0.0", max_length = 30, content_type = "stripped", blank = True, help_text = "Version of Service Controller", null = True, db_index = False];
- optional string provides = 5 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of things provided", null = True, db_index = False];
- optional string requires = 6 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of required Service Controllers", null = True, db_index = False];
+message Library (LoadableModule){
}
diff --git a/xos/genx/xprotos/core/loadablemodule.xproto b/xos/genx/xprotos/core/loadablemodule.xproto
index 79fa8bd..9f953d4 100644
--- a/xos/genx/xprotos/core/loadablemodule.xproto
+++ b/xos/genx/xprotos/core/loadablemodule.xproto
@@ -1,6 +1,6 @@
-message LoadableModule {
+message LoadableModule (PlCoreBase){
required manytoone xos->XOS:loadable_modules = 1 [help_text = "Pointer to XOS", default = "get_xos()", null = False, db_index = True, blank = False];
required string name = 2 [max_length = 30, content_type = "stripped", blank = False, help_text = "Service Name", null = False, db_index = False];
optional string base_url = 3 [max_length = 1024, content_type = "stripped", blank = True, help_text = "Base URL, allows use of relative URLs for resources", null = True, db_index = False];
diff --git a/xos/genx/xprotos/core/loadablemoduleresource.xproto b/xos/genx/xprotos/core/loadablemoduleresource.xproto
index fabc4af..f91729f 100644
--- a/xos/genx/xprotos/core/loadablemoduleresource.xproto
+++ b/xos/genx/xprotos/core/loadablemoduleresource.xproto
@@ -1,6 +1,6 @@
-message LoadableModuleResource {
+message LoadableModuleResource (PlCoreBase){
required manytoone loadable_module->LoadableModule:loadable_module_resources = 1 [help_text = "The Loadable Module this resource is associated with", null = False, db_index = True, blank = False];
required string name = 2 [max_length = 30, content_type = "stripped", blank = False, help_text = "Object Name", null = False, db_index = False];
optional string subdirectory = 3 [max_length = 1024, content_type = "stripped", blank = True, help_text = "optional subdirectory", null = True, db_index = False];
diff --git a/xos/genx/xprotos/core/network.xproto b/xos/genx/xprotos/core/network.xproto
index 7eb3bcf..b2495b4 100644
--- a/xos/genx/xprotos/core/network.xproto
+++ b/xos/genx/xprotos/core/network.xproto
@@ -1,6 +1,6 @@
-message Network {
+message Network (PlCoreBase,ParameterMixin){
required string name = 1 [db_index = False, max_length = 32, null = False, blank = False];
required manytoone template->NetworkTemplate:network = 2 [db_index = True, null = False, blank = False];
required string subnet = 3 [db_index = False, max_length = 32, null = False, blank = True];
@@ -18,4 +18,7 @@
optional string router_id = 15 [help_text = "Quantum router id", max_length = 256, null = True, db_index = False, blank = True];
optional string subnet_id = 16 [help_text = "Quantum subnet id", max_length = 256, null = True, db_index = False, blank = True];
required bool autoconnect = 17 [help_text = "This network can be autoconnected to the slice that owns it", default = True, null = False, db_index = False, blank = True];
+ required manytomany permitted_slices->Slice/NetworkSlice:availableNetworks = 18 [db_index = False, null = False, blank = True];
+ required manytomany slices->Slice/NetworkSlice:networks = 19 [db_index = False, null = False, blank = True];
+ required manytomany instances->Instance/Port:networks = 20 [db_index = False, null = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/networkparameter.xproto b/xos/genx/xprotos/core/networkparameter.xproto
index 407ad03..81585ee 100644
--- a/xos/genx/xprotos/core/networkparameter.xproto
+++ b/xos/genx/xprotos/core/networkparameter.xproto
@@ -1,6 +1,6 @@
-message NetworkParameter {
+message NetworkParameter (PlCoreBase){
required manytoone parameter->NetworkParameterType:networkparameters = 1 [help_text = "The type of the parameter", null = False, db_index = True, blank = False];
required string value = 2 [help_text = "The value of this parameter", max_length = 1024, null = False, db_index = False, blank = False];
required manytoone content_type->ContentType:networkparameter = 3 [db_index = True, null = False, blank = False];
diff --git a/xos/genx/xprotos/core/networkparametertype.xproto b/xos/genx/xprotos/core/networkparametertype.xproto
index 2126749..6eb7804 100644
--- a/xos/genx/xprotos/core/networkparametertype.xproto
+++ b/xos/genx/xprotos/core/networkparametertype.xproto
@@ -1,6 +1,6 @@
-message NetworkParameterType {
+message NetworkParameterType (PlCoreBase){
required string name = 1 [help_text = "The name of this parameter", max_length = 128, null = False, db_index = True, blank = False];
required string description = 2 [db_index = False, max_length = 1024, null = False, blank = False];
}
diff --git a/xos/genx/xprotos/core/networkslice.xproto b/xos/genx/xprotos/core/networkslice.xproto
index 3d76ccf..7ae04a2 100644
--- a/xos/genx/xprotos/core/networkslice.xproto
+++ b/xos/genx/xprotos/core/networkslice.xproto
@@ -1,6 +1,6 @@
-message NetworkSlice {
+message NetworkSlice (PlCoreBase){
required manytoone network->Network:networkslices = 1 [db_index = True, null = False, blank = False];
required manytoone slice->Slice:networkslices = 2 [db_index = True, null = False, blank = False];
}
diff --git a/xos/genx/xprotos/core/networktemplate.xproto b/xos/genx/xprotos/core/networktemplate.xproto
index 2881598..3d17277 100644
--- a/xos/genx/xprotos/core/networktemplate.xproto
+++ b/xos/genx/xprotos/core/networktemplate.xproto
@@ -1,6 +1,6 @@
-message NetworkTemplate {
+message NetworkTemplate (PlCoreBase,ParameterMixin){
required string name = 1 [db_index = False, max_length = 32, null = False, blank = False];
optional string description = 2 [db_index = False, max_length = 1024, null = True, blank = True];
required int32 guaranteed_bandwidth = 3 [default = 0, null = False, db_index = False, blank = False];
diff --git a/xos/genx/xprotos/core/node.xproto b/xos/genx/xprotos/core/node.xproto
index de2f393..3a88b6a 100644
--- a/xos/genx/xprotos/core/node.xproto
+++ b/xos/genx/xprotos/core/node.xproto
@@ -1,7 +1,8 @@
-message Node {
+message Node (PlCoreBase){
required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the Node", null = False, db_index = False];
required manytoone site_deployment->SiteDeployment:nodes = 2 [db_index = True, null = False, blank = False];
optional manytoone site->Site:nodes = 3 [db_index = True, null = True, blank = True];
+ required manytomany tags->Tag = 4 [db_index = False, null = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/nodelabel.xproto b/xos/genx/xprotos/core/nodelabel.xproto
index 7b01be6..fc89a46 100644
--- a/xos/genx/xprotos/core/nodelabel.xproto
+++ b/xos/genx/xprotos/core/nodelabel.xproto
@@ -1,5 +1,6 @@
-message NodeLabel {
+message NodeLabel (PlCoreBase){
required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "label name", null = False, db_index = False];
+ required manytomany node->Node/NodeLabel_node:nodelabels = 2 [db_index = False, null = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/payment.xproto b/xos/genx/xprotos/core/payment.xproto
index 28229a9..f9723ad 100644
--- a/xos/genx/xprotos/core/payment.xproto
+++ b/xos/genx/xprotos/core/payment.xproto
@@ -1,6 +1,6 @@
-message Payment {
+message Payment (PlCoreBase){
required manytoone account->Account:payments = 1 [db_index = True, null = False, blank = False];
required float amount = 2 [default = 0.0, null = False, db_index = False, blank = False];
required string date = 3 [default = "now()", null = False, db_index = False, content_type = "date", blank = False];
diff --git a/xos/genx/xprotos/core/port.xproto b/xos/genx/xprotos/core/port.xproto
index c07f41f..a3a9cdc 100644
--- a/xos/genx/xprotos/core/port.xproto
+++ b/xos/genx/xprotos/core/port.xproto
@@ -1,6 +1,6 @@
-message Port {
+message Port (PlCoreBase,ParameterMixin){
required manytoone network->Network:links = 1 [db_index = True, null = False, blank = False];
optional manytoone instance->Instance:ports = 2 [db_index = True, null = True, blank = True];
optional string ip = 3 [max_length = 39, content_type = "ip", blank = True, help_text = "Instance ip address", null = True, db_index = False];
diff --git a/xos/genx/xprotos/core/program.xproto b/xos/genx/xprotos/core/program.xproto
index 5ae442a..38b083e 100644
--- a/xos/genx/xprotos/core/program.xproto
+++ b/xos/genx/xprotos/core/program.xproto
@@ -1,6 +1,6 @@
-message Program {
+message Program (PlCoreBase){
required string name = 1 [max_length = 30, content_type = "stripped", blank = False, help_text = "Service Name", null = False, db_index = False];
optional string description = 2 [help_text = "Description of Service", max_length = 254, null = True, db_index = False, blank = True];
required string kind = 3 [choices = "(('tosca', 'Tosca'),)", max_length = 30, content_type = "stripped", blank = False, help_text = "Kind of service", null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/project.xproto b/xos/genx/xprotos/core/project.xproto
index 10bc249..d857de9 100644
--- a/xos/genx/xprotos/core/project.xproto
+++ b/xos/genx/xprotos/core/project.xproto
@@ -1,5 +1,5 @@
-message Project {
+message Project (PlCoreBase){
required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of Project", null = False, db_index = False];
}
diff --git a/xos/genx/xprotos/core/reservation.xproto b/xos/genx/xprotos/core/reservation.xproto
index 8a02ee5..be00e7f 100644
--- a/xos/genx/xprotos/core/reservation.xproto
+++ b/xos/genx/xprotos/core/reservation.xproto
@@ -1,6 +1,6 @@
-message Reservation {
+message Reservation (PlCoreBase){
required string startTime = 1 [db_index = False, null = False, content_type = "date", blank = False];
required manytoone slice->Slice:reservations = 2 [db_index = True, null = False, blank = False];
required int32 duration = 3 [default = 1, null = False, db_index = False, blank = False];
diff --git a/xos/genx/xprotos/core/reservedresource.xproto b/xos/genx/xprotos/core/reservedresource.xproto
index 78146b3..d3baae7 100644
--- a/xos/genx/xprotos/core/reservedresource.xproto
+++ b/xos/genx/xprotos/core/reservedresource.xproto
@@ -1,6 +1,6 @@
-message ReservedResource {
+message ReservedResource (PlCoreBase){
required manytoone instance->Instance:reservedresources = 1 [db_index = True, null = False, blank = False];
required manytoone resource->ServiceResource:reservedresources = 2 [db_index = True, null = False, blank = False];
required int32 quantity = 3 [default = 1, null = False, db_index = False, blank = False];
diff --git a/xos/genx/xprotos/core/role.xproto b/xos/genx/xprotos/core/role.xproto
index 55a4ad1..2ebde68 100644
--- a/xos/genx/xprotos/core/role.xproto
+++ b/xos/genx/xprotos/core/role.xproto
@@ -1,6 +1,6 @@
-message Role {
+message Role (PlCoreBase){
required string role_type = 1 [db_index = False, max_length = 80, null = False, content_type = "stripped", blank = False];
optional string role = 2 [db_index = False, max_length = 80, null = True, content_type = "stripped", blank = True];
required string description = 3 [db_index = False, max_length = 120, null = False, content_type = "stripped", blank = False];
diff --git a/xos/genx/xprotos/core/router.xproto b/xos/genx/xprotos/core/router.xproto
index 7ca796b..da1e773 100644
--- a/xos/genx/xprotos/core/router.xproto
+++ b/xos/genx/xprotos/core/router.xproto
@@ -1,6 +1,8 @@
-message Router {
+message Router (PlCoreBase){
required string name = 1 [db_index = False, max_length = 32, null = False, blank = False];
required manytoone owner->Slice:routers = 2 [db_index = True, null = False, blank = False];
+ required manytomany permittedNetworks->Network/Router_networks:availableRouters = 3 [db_index = False, null = False, blank = True];
+ required manytomany networks->Network/Router_networks:routers = 4 [db_index = False, null = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/service.xproto b/xos/genx/xprotos/core/service.xproto
index 13a18f1..e3ba5bb 100644
--- a/xos/genx/xprotos/core/service.xproto
+++ b/xos/genx/xprotos/core/service.xproto
@@ -1,6 +1,6 @@
-message Service {
+message Service (PlCoreBase,AttributeMixin){
optional string description = 1 [help_text = "Description of Service", max_length = 254, null = True, db_index = False, blank = True];
required bool enabled = 2 [default = True, null = False, db_index = False, blank = True];
required string kind = 3 [default = "generic", max_length = 30, content_type = "stripped", blank = False, help_text = "Kind of service", null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/serviceattribute.xproto b/xos/genx/xprotos/core/serviceattribute.xproto
index 5465c62..d333aa2 100644
--- a/xos/genx/xprotos/core/serviceattribute.xproto
+++ b/xos/genx/xprotos/core/serviceattribute.xproto
@@ -1,6 +1,6 @@
-message ServiceAttribute {
+message ServiceAttribute (PlCoreBase){
required string name = 1 [help_text = "Attribute Name", max_length = 128, null = False, db_index = False, blank = False];
required string value = 2 [help_text = "Attribute Value", null = False, db_index = False, blank = False];
required manytoone service->Service:serviceattributes = 3 [help_text = "The Service this attribute is associated with", null = False, db_index = True, blank = False];
diff --git a/xos/genx/xprotos/core/serviceclass.xproto b/xos/genx/xprotos/core/serviceclass.xproto
index 8b665dd..9f1e4cf 100644
--- a/xos/genx/xprotos/core/serviceclass.xproto
+++ b/xos/genx/xprotos/core/serviceclass.xproto
@@ -1,10 +1,11 @@
-message ServiceClass {
+message ServiceClass (PlCoreBase){
required string name = 1 [db_index = False, max_length = 32, null = False, content_type = "stripped", blank = False];
required string description = 2 [db_index = False, max_length = 255, null = False, content_type = "stripped", blank = False];
required int32 commitment = 3 [default = 365, null = False, db_index = False, blank = False];
required int32 membershipFee = 4 [default = 0, null = False, db_index = False, blank = False];
required int32 membershipFeeMonths = 5 [default = 12, null = False, db_index = False, blank = False];
required bool upgradeRequiresApproval = 6 [default = False, null = False, db_index = False, blank = True];
+ required manytomany upgradeFrom->ServiceClass/ServiceClass_upgradeFrom:upgradeFrom_rel_+ = 7 [db_index = False, null = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/servicecontroller.xproto b/xos/genx/xprotos/core/servicecontroller.xproto
index 41cb54d..aa4baaa 100644
--- a/xos/genx/xprotos/core/servicecontroller.xproto
+++ b/xos/genx/xprotos/core/servicecontroller.xproto
@@ -1,16 +1,10 @@
-message ServiceController {
- required manytoone xos->XOS:loadable_modules = 1 [help_text = "Pointer to XOS", default = "get_xos()", null = False, db_index = True, blank = False];
- required string name = 2 [max_length = 30, content_type = "stripped", blank = False, help_text = "Service Name", null = False, db_index = False];
- optional string base_url = 3 [max_length = 1024, content_type = "stripped", blank = True, help_text = "Base URL, allows use of relative URLs for resources", null = True, db_index = False];
- optional string version = 4 [default = "1.0.0", max_length = 30, content_type = "stripped", blank = True, help_text = "Version of Service Controller", null = True, db_index = False];
- optional string provides = 5 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of things provided", null = True, db_index = False];
- optional string requires = 6 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of required Service Controllers", null = True, db_index = False];
- optional string synchronizer_run = 7 [max_length = 1024, content_type = "stripped", blank = True, help_text = "synchronizer run command", null = True, db_index = False];
- optional string synchronizer_config = 8 [max_length = 1024, content_type = "stripped", blank = True, help_text = "synchronizer config file", null = True, db_index = False];
- optional string image = 9 [max_length = 200, content_type = "stripped", blank = True, help_text = "docker image name", null = True, db_index = False];
- required bool no_start = 10 [help_text = "Do not start the Synchronizer", default = False, null = False, db_index = False, blank = True];
- required bool no_build = 11 [help_text = "Do not build the Synchronizer container", default = False, null = False, db_index = False, blank = True];
- required bool no_deploy = 12 [help_text = "Do not add synchronizer container to onboarding-docker-compose", default = False, null = False, db_index = False, blank = True];
+message ServiceController (LoadableModule){
+ optional string synchronizer_run = 1 [max_length = 1024, content_type = "stripped", blank = True, help_text = "synchronizer run command", null = True, db_index = False];
+ optional string synchronizer_config = 2 [max_length = 1024, content_type = "stripped", blank = True, help_text = "synchronizer config file", null = True, db_index = False];
+ optional string image = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "docker image name", null = True, db_index = False];
+ required bool no_start = 4 [help_text = "Do not start the Synchronizer", default = False, null = False, db_index = False, blank = True];
+ required bool no_build = 5 [help_text = "Do not build the Synchronizer container", default = False, null = False, db_index = False, blank = True];
+ required bool no_deploy = 6 [help_text = "Do not add synchronizer container to onboarding-docker-compose", default = False, null = False, db_index = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/servicedependency.xproto b/xos/genx/xprotos/core/servicedependency.xproto
index 07a170f..09248fe 100644
--- a/xos/genx/xprotos/core/servicedependency.xproto
+++ b/xos/genx/xprotos/core/servicedependency.xproto
@@ -1,15 +1,4 @@
-message ServiceDependency {
- optional string name = 1 [db_index = False, max_length = 200, null = True, content_type = "stripped", blank = True];
- required string kind = 2 [default = "generic", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
- required manytoone provider_service->Service:provided_tenants = 3 [db_index = True, null = False, blank = False];
- optional manytoone subscriber_service->Service:subscribed_tenants = 4 [db_index = True, null = True, blank = True];
- optional manytoone subscriber_tenant->Tenant:subscribed_tenants = 5 [db_index = True, null = True, blank = True];
- optional manytoone subscriber_user->User:subscribed_tenants = 6 [db_index = True, null = True, blank = True];
- optional manytoone subscriber_root->TenantRoot:subscribed_tenants = 7 [db_index = True, null = True, blank = True];
- optional manytoone subscriber_network->Network:subscribed_tenants = 8 [db_index = True, null = True, blank = True];
- optional string service_specific_id = 9 [db_index = False, max_length = 30, null = True, content_type = "stripped", blank = True];
- optional string service_specific_attribute = 10 [db_index = False, null = True, blank = True];
- required string connect_method = 11 [default = "na", choices = "(('public', 'Public'), ('private', 'Private'), ('private-unidirectional', 'Private Unidirectional'), ('na', 'Not Applicable'))", max_length = 30, blank = False, null = False, db_index = False];
+message ServiceDependency (Tenant){
}
diff --git a/xos/genx/xprotos/core/servicemonitoringagentinfo.xproto b/xos/genx/xprotos/core/servicemonitoringagentinfo.xproto
index 0636419..4a4e466 100644
--- a/xos/genx/xprotos/core/servicemonitoringagentinfo.xproto
+++ b/xos/genx/xprotos/core/servicemonitoringagentinfo.xproto
@@ -1,6 +1,6 @@
-message ServiceMonitoringAgentInfo {
+message ServiceMonitoringAgentInfo (PlCoreBase){
required string name = 1 [help_text = "Monitoring Agent Name", max_length = 128, null = False, db_index = False, blank = False];
optional manytoone service->Service:servicemonitoringagents = 2 [help_text = "The Service this attribute is associated with", null = True, db_index = True, blank = True];
required string target_uri = 3 [help_text = "Monitoring collector URI to be used by agents to publish the data", null = False, db_index = False, blank = False];
diff --git a/xos/genx/xprotos/core/serviceprivilege.xproto b/xos/genx/xprotos/core/serviceprivilege.xproto
index a6b130b..f88acef 100644
--- a/xos/genx/xprotos/core/serviceprivilege.xproto
+++ b/xos/genx/xprotos/core/serviceprivilege.xproto
@@ -1,6 +1,6 @@
-message ServicePrivilege {
+message ServicePrivilege (PlCoreBase){
required manytoone user->User:serviceprivileges = 1 [db_index = True, null = False, blank = False];
required manytoone service->Service:serviceprivileges = 2 [db_index = True, null = False, blank = False];
required manytoone role->ServiceRole:serviceprivileges = 3 [db_index = True, null = False, blank = False];
diff --git a/xos/genx/xprotos/core/serviceresource.xproto b/xos/genx/xprotos/core/serviceresource.xproto
index fbd662b..46cb5c4 100644
--- a/xos/genx/xprotos/core/serviceresource.xproto
+++ b/xos/genx/xprotos/core/serviceresource.xproto
@@ -1,6 +1,6 @@
-message ServiceResource {
+message ServiceResource (PlCoreBase){
required manytoone serviceClass->ServiceClass:serviceresources = 1 [db_index = True, null = False, blank = False];
required string name = 2 [db_index = False, max_length = 32, null = False, content_type = "stripped", blank = False];
required int32 maxUnitsDeployment = 3 [default = 1, null = False, db_index = False, blank = False];
diff --git a/xos/genx/xprotos/core/servicerole.xproto b/xos/genx/xprotos/core/servicerole.xproto
index 92cb5d4..3661df4 100644
--- a/xos/genx/xprotos/core/servicerole.xproto
+++ b/xos/genx/xprotos/core/servicerole.xproto
@@ -1,5 +1,5 @@
-message ServiceRole {
+message ServiceRole (PlCoreBase){
required string role = 1 [choices = "(('admin', 'Admin'),)", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
}
diff --git a/xos/genx/xprotos/core/site.xproto b/xos/genx/xprotos/core/site.xproto
index e525ce2..550be4f 100644
--- a/xos/genx/xprotos/core/site.xproto
+++ b/xos/genx/xprotos/core/site.xproto
@@ -1,6 +1,6 @@
-message Site {
+message Site (PlCoreBase){
required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name for this Site", null = False, db_index = False];
optional string site_url = 2 [max_length = 512, content_type = "url", blank = True, help_text = "Site's Home URL Page", null = True, db_index = False];
required bool enabled = 3 [help_text = "Status for this Site", default = True, null = False, db_index = False, blank = True];
@@ -11,4 +11,6 @@
required string login_base = 8 [max_length = 50, content_type = "stripped", blank = False, help_text = "Prefix for Slices associated with this Site", null = False, db_index = False];
required bool is_public = 9 [help_text = "Indicates the visibility of this site to other members", default = True, null = False, db_index = False, blank = True];
required string abbreviated_name = 10 [db_index = False, max_length = 80, null = False, content_type = "stripped", blank = False];
+ required manytomany deployments->Deployment/DashboardView_deployments:sites = 11 [help_text = "Select which sites are allowed to host nodes in this deployment", null = False, db_index = False, blank = True];
+ required manytomany tags->Tag = 12 [db_index = False, null = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/sitecredential.xproto b/xos/genx/xprotos/core/sitecredential.xproto
index 44d74f3..f6a3fec 100644
--- a/xos/genx/xprotos/core/sitecredential.xproto
+++ b/xos/genx/xprotos/core/sitecredential.xproto
@@ -1,6 +1,6 @@
-message SiteCredential {
+message SiteCredential (PlCoreBase){
required manytoone site->Site:sitecredentials = 1 [help_text = "The User this credential is associated with", null = False, db_index = True, blank = False];
required string name = 2 [help_text = "The credential type, e.g. ec2", max_length = 128, null = False, db_index = True, blank = False];
required string key_id = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "The backend id of this credential", null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/sitedeployment.xproto b/xos/genx/xprotos/core/sitedeployment.xproto
index 532b042..ae12aa1 100644
--- a/xos/genx/xprotos/core/sitedeployment.xproto
+++ b/xos/genx/xprotos/core/sitedeployment.xproto
@@ -1,6 +1,6 @@
-message SiteDeployment {
+message SiteDeployment (PlCoreBase){
required manytoone site->Site:sitedeployments = 1 [db_index = True, null = False, blank = False];
required manytoone deployment->Deployment:sitedeployments = 2 [db_index = True, null = False, blank = False];
optional manytoone controller->Controller:sitedeployments = 3 [db_index = True, null = True, blank = True];
diff --git a/xos/genx/xprotos/core/siteprivilege.xproto b/xos/genx/xprotos/core/siteprivilege.xproto
index 4812f38..c63677a 100644
--- a/xos/genx/xprotos/core/siteprivilege.xproto
+++ b/xos/genx/xprotos/core/siteprivilege.xproto
@@ -1,6 +1,6 @@
-message SitePrivilege {
+message SitePrivilege (PlCoreBase){
required manytoone user->User:siteprivileges = 1 [db_index = True, null = False, blank = False];
required manytoone site->Site:siteprivileges = 2 [db_index = True, null = False, blank = False];
required manytoone role->SiteRole:siteprivileges = 3 [db_index = True, null = False, blank = False];
diff --git a/xos/genx/xprotos/core/siterole.xproto b/xos/genx/xprotos/core/siterole.xproto
index 1558503..a42ef5c 100644
--- a/xos/genx/xprotos/core/siterole.xproto
+++ b/xos/genx/xprotos/core/siterole.xproto
@@ -1,5 +1,5 @@
-message SiteRole {
+message SiteRole (PlCoreBase){
required string role = 1 [choices = "(('admin', 'Admin'), ('pi', 'PI'), ('tech', 'Tech'), ('billing', 'Billing'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
}
diff --git a/xos/genx/xprotos/core/slice.xproto b/xos/genx/xprotos/core/slice.xproto
index 06bcdb0..5b1acaa 100644
--- a/xos/genx/xprotos/core/slice.xproto
+++ b/xos/genx/xprotos/core/slice.xproto
@@ -1,6 +1,4 @@
-
-
-message Slice {
+message Slice (PlCoreBase){
required string name = 1 [max_length = 80, content_type = "stripped", blank = False, help_text = "The Name of the Slice", null = False, db_index = False];
required bool enabled = 2 [help_text = "Status for this Slice", default = True, null = False, db_index = False, blank = True];
required bool omf_friendly = 3 [default = False, null = False, db_index = False, blank = True];
@@ -18,4 +16,5 @@
optional manytoone default_node->Node:slices = 15 [db_index = True, null = True, blank = True];
optional string mount_data_sets = 16 [default = "GenBank", max_length = 256, content_type = "stripped", blank = True, null = True, db_index = False];
required string default_isolation = 17 [default = "vm", choices = "(('vm', 'Virtual Machine'), ('container', 'Container'), ('container_vm', 'Container In VM'))", max_length = 30, blank = False, null = False, db_index = False];
+ required manytomany tags->Tag = 18 [db_index = False, null = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/slicecredential.xproto b/xos/genx/xprotos/core/slicecredential.xproto
index 31ce074..3ae9ed9 100644
--- a/xos/genx/xprotos/core/slicecredential.xproto
+++ b/xos/genx/xprotos/core/slicecredential.xproto
@@ -1,6 +1,6 @@
-message SliceCredential {
+message SliceCredential (PlCoreBase){
required manytoone slice->Slice:slicecredentials = 1 [help_text = "The User this credential is associated with", null = False, db_index = True, blank = False];
required string name = 2 [help_text = "The credential type, e.g. ec2", max_length = 128, null = False, db_index = True, blank = False];
required string key_id = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "The backend id of this credential", null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/sliceprivilege.xproto b/xos/genx/xprotos/core/sliceprivilege.xproto
index 4189a1a..587f423 100644
--- a/xos/genx/xprotos/core/sliceprivilege.xproto
+++ b/xos/genx/xprotos/core/sliceprivilege.xproto
@@ -1,6 +1,6 @@
-message SlicePrivilege {
+message SlicePrivilege (PlCoreBase){
required manytoone user->User:sliceprivileges = 1 [db_index = True, null = False, blank = False];
required manytoone slice->Slice:sliceprivileges = 2 [db_index = True, null = False, blank = False];
required manytoone role->SliceRole:sliceprivileges = 3 [db_index = True, null = False, blank = False];
diff --git a/xos/genx/xprotos/core/slicerole.xproto b/xos/genx/xprotos/core/slicerole.xproto
index 7a9d941..6396518 100644
--- a/xos/genx/xprotos/core/slicerole.xproto
+++ b/xos/genx/xprotos/core/slicerole.xproto
@@ -1,5 +1,5 @@
-message SliceRole {
+message SliceRole (PlCoreBase){
required string role = 1 [choices = "(('admin', 'Admin'), ('default', 'Default'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
}
diff --git a/xos/genx/xprotos/core/slicetag.xproto b/xos/genx/xprotos/core/slicetag.xproto
index 60ce38b..a2cac93 100644
--- a/xos/genx/xprotos/core/slicetag.xproto
+++ b/xos/genx/xprotos/core/slicetag.xproto
@@ -1,6 +1,6 @@
-message SliceTag {
+message SliceTag (PlCoreBase){
required manytoone slice->Slice:slicetags = 1 [db_index = True, null = False, blank = False];
required string name = 2 [choices = "(('privatekey', 'Private Key'), ('publickey', 'Public Key'))", max_length = 30, content_type = "stripped", blank = False, help_text = "The name of this tag", null = False, db_index = False];
required string value = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "The value of this tag", null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/tag.xproto b/xos/genx/xprotos/core/tag.xproto
index 088c32d..45662a8 100644
--- a/xos/genx/xprotos/core/tag.xproto
+++ b/xos/genx/xprotos/core/tag.xproto
@@ -1,6 +1,6 @@
-message Tag {
+message Tag (PlCoreBase){
required manytoone service->Service:tags = 1 [help_text = "The Service this Tag is associated with", null = False, db_index = True, blank = False];
required string name = 2 [help_text = "The name of this tag", max_length = 128, null = False, db_index = True, blank = False];
required string value = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "The value of this tag", null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/tenant.xproto b/xos/genx/xprotos/core/tenant.xproto
index daa9da9..91de112 100644
--- a/xos/genx/xprotos/core/tenant.xproto
+++ b/xos/genx/xprotos/core/tenant.xproto
@@ -1,6 +1,6 @@
-message Tenant {
+message Tenant (PlCoreBase,AttributeMixin){
optional string name = 1 [db_index = False, max_length = 200, null = True, content_type = "stripped", blank = True];
required string kind = 2 [default = "generic", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
required manytoone provider_service->Service:provided_tenants = 3 [db_index = True, null = False, blank = False];
diff --git a/xos/genx/xprotos/core/tenantattribute.xproto b/xos/genx/xprotos/core/tenantattribute.xproto
index a71a783..f9a3abe 100644
--- a/xos/genx/xprotos/core/tenantattribute.xproto
+++ b/xos/genx/xprotos/core/tenantattribute.xproto
@@ -1,6 +1,6 @@
-message TenantAttribute {
+message TenantAttribute (PlCoreBase){
required string name = 1 [help_text = "Attribute Name", max_length = 128, null = False, db_index = False, blank = False];
required string value = 2 [help_text = "Attribute Value", null = False, db_index = False, blank = False];
required manytoone tenant->Tenant:tenantattributes = 3 [help_text = "The Tenant this attribute is associated with", null = False, db_index = True, blank = False];
diff --git a/xos/genx/xprotos/core/tenantprivilege.xproto b/xos/genx/xprotos/core/tenantprivilege.xproto
index af15f33..9d90981 100644
--- a/xos/genx/xprotos/core/tenantprivilege.xproto
+++ b/xos/genx/xprotos/core/tenantprivilege.xproto
@@ -1,6 +1,6 @@
-message TenantPrivilege {
+message TenantPrivilege (PlCoreBase){
required manytoone user->User:tenantprivileges = 1 [db_index = True, null = False, blank = False];
required manytoone tenant->Tenant:tenantprivileges = 2 [db_index = True, null = False, blank = False];
required manytoone role->TenantRole:tenantprivileges = 3 [db_index = True, null = False, blank = False];
diff --git a/xos/genx/xprotos/core/tenantrole.xproto b/xos/genx/xprotos/core/tenantrole.xproto
index bb427a9..646809e 100644
--- a/xos/genx/xprotos/core/tenantrole.xproto
+++ b/xos/genx/xprotos/core/tenantrole.xproto
@@ -1,5 +1,5 @@
-message TenantRole {
+message TenantRole (PlCoreBase){
required string role = 1 [choices = "(('admin', 'Admin'), ('access', 'Access'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
}
diff --git a/xos/genx/xprotos/core/tenantroot.xproto b/xos/genx/xprotos/core/tenantroot.xproto
index eab7052..3c01492 100644
--- a/xos/genx/xprotos/core/tenantroot.xproto
+++ b/xos/genx/xprotos/core/tenantroot.xproto
@@ -1,6 +1,6 @@
-message TenantRoot {
+message TenantRoot (PlCoreBase,AttributeMixin){
required string kind = 1 [default = "generic", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
optional string name = 2 [max_length = 255, content_type = "stripped", blank = True, help_text = "name", null = True, db_index = False];
optional string service_specific_attribute = 3 [db_index = False, null = True, blank = True];
diff --git a/xos/genx/xprotos/core/tenantrootprivilege.xproto b/xos/genx/xprotos/core/tenantrootprivilege.xproto
index baf419a..cf86119 100644
--- a/xos/genx/xprotos/core/tenantrootprivilege.xproto
+++ b/xos/genx/xprotos/core/tenantrootprivilege.xproto
@@ -1,6 +1,6 @@
-message TenantRootPrivilege {
+message TenantRootPrivilege (PlCoreBase){
required manytoone user->User:tenant_root_privileges = 1 [db_index = True, null = False, blank = False];
required manytoone tenant_root->TenantRoot:tenant_root_privileges = 2 [db_index = True, null = False, blank = False];
required manytoone role->TenantRootRole:tenant_root_privileges = 3 [db_index = True, null = False, blank = False];
diff --git a/xos/genx/xprotos/core/tenantrootrole.xproto b/xos/genx/xprotos/core/tenantrootrole.xproto
index 26798ab..87346ac 100644
--- a/xos/genx/xprotos/core/tenantrootrole.xproto
+++ b/xos/genx/xprotos/core/tenantrootrole.xproto
@@ -1,5 +1,5 @@
-message TenantRootRole {
+message TenantRootRole (PlCoreBase){
required string role = 1 [choices = "(('admin', 'Admin'), ('access', 'Access'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
}
diff --git a/xos/genx/xprotos/core/tenantwithcontainer.xproto b/xos/genx/xprotos/core/tenantwithcontainer.xproto
index 3c7b8e9..2bef221 100644
--- a/xos/genx/xprotos/core/tenantwithcontainer.xproto
+++ b/xos/genx/xprotos/core/tenantwithcontainer.xproto
@@ -1,19 +1,8 @@
-message TenantWithContainer(Tenant) {
- optional string name = 1 [db_index = False, max_length = 200, null = True, content_type = "stripped", blank = True];
- required string kind = 2 [default = "generic", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
- required manytoone provider_service->Service:provided_tenants = 3 [db_index = True, null = False, blank = False];
- optional manytoone subscriber_service->Service:subscribed_tenants = 4 [db_index = True, null = True, blank = True];
- optional manytoone subscriber_tenant->Tenant:subscribed_tenants = 5 [db_index = True, null = True, blank = True];
- optional manytoone subscriber_user->User:subscribed_tenants = 6 [db_index = True, null = True, blank = True];
- optional manytoone subscriber_root->TenantRoot:subscribed_tenants = 7 [db_index = True, null = True, blank = True];
- optional manytoone subscriber_network->Network:subscribed_tenants = 8 [db_index = True, null = True, blank = True];
- optional string service_specific_id = 9 [db_index = False, max_length = 30, null = True, content_type = "stripped", blank = True];
- optional string service_specific_attribute = 10 [db_index = False, null = True, blank = True];
- required string connect_method = 11 [default = "na", choices = "(('public', 'Public'), ('private', 'Private'), ('private-unidirectional', 'Private Unidirectional'), ('na', 'Not Applicable'))", max_length = 30, blank = False, null = False, db_index = False];
- optional manytoone instance->Instance:_ = 12 [help_text = "Instance used by this Tenant", null = True, db_index = True, blank = True];
- optional manytoone creator->User:_ = 13 [help_text = "Creator of this Tenant", null = True, db_index = True, blank = True];
- optional string external_hostname = 14 [max_length = 30, content_type = "stripped", blank = True, help_text = "External host name", null = True, db_index = False];
- optional string external_container = 15 [max_length = 30, content_type = "stripped", blank = True, help_text = "External host name", null = True, db_index = False];
+message TenantWithContainer (Tenant){
+ optional manytoone instance->Instance:+ = 1 [help_text = "Instance used by this Tenant", null = True, db_index = True, blank = True];
+ optional manytoone creator->User:+ = 2 [help_text = "Creator of this Tenant", null = True, db_index = True, blank = True];
+ optional string external_hostname = 3 [max_length = 30, content_type = "stripped", blank = True, help_text = "External host name", null = True, db_index = False];
+ optional string external_container = 4 [max_length = 30, content_type = "stripped", blank = True, help_text = "External host name", null = True, db_index = False];
}
diff --git a/xos/genx/xprotos/core/usableobject.xproto b/xos/genx/xprotos/core/usableobject.xproto
index 6bff808..8437318 100644
--- a/xos/genx/xprotos/core/usableobject.xproto
+++ b/xos/genx/xprotos/core/usableobject.xproto
@@ -1,5 +1,5 @@
-message UsableObject {
+message UsableObject (PlCoreBase){
required string name = 1 [db_index = False, max_length = 1024, null = False, content_type = "stripped", blank = False];
}
diff --git a/xos/genx/xprotos/core/user.xproto b/xos/genx/xprotos/core/user.xproto
deleted file mode 100644
index 006b67c..0000000
--- a/xos/genx/xprotos/core/user.xproto
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-message User {
- required string password = 1 [db_index = False, max_length = 128, null = False, blank = False];
- optional string last_login = 2 [db_index = False, null = True, content_type = "date", blank = True];
- required string email = 3 [db_index = True, max_length = 255, null = False, blank = False];
- required string username = 4 [default = "Something", max_length = 255, content_type = "stripped", blank = False, null = False, db_index = False];
- required string firstname = 5 [max_length = 200, content_type = "stripped", blank = False, help_text = "person's given name", null = False, db_index = False];
- required string lastname = 6 [max_length = 200, content_type = "stripped", blank = False, help_text = "person's surname", null = False, db_index = False];
- optional string phone = 7 [max_length = 100, content_type = "stripped", blank = True, help_text = "phone number contact", null = True, db_index = False];
- optional string user_url = 8 [db_index = False, max_length = 200, null = True, content_type = "url", blank = True];
- required manytoone site->Site:users = 9 [help_text = "Site this user will be homed too", null = False, db_index = True, blank = False];
- optional string public_key = 10 [help_text = "Public key string", max_length = 1024, null = True, db_index = False, blank = True];
- required bool is_active = 11 [default = True, null = False, db_index = False, blank = True];
- required bool is_admin = 12 [default = False, null = False, db_index = False, blank = True];
- required bool is_staff = 13 [default = True, null = False, db_index = False, blank = True];
- required bool is_readonly = 14 [default = False, null = False, db_index = False, blank = True];
- required bool is_registering = 15 [default = False, null = False, db_index = False, blank = True];
- required bool is_appuser = 16 [default = False, null = False, db_index = False, blank = True];
- optional string login_page = 17 [max_length = 200, content_type = "stripped", blank = True, help_text = "send this user to a specific page on login", null = True, db_index = False];
- required string timezone = 18 [default = "America/New_York", choices = "[('Pacific/Midway', '(GMT-1100) Pacific/Midway'), ('Pacific/Niue', '(GMT-1100) Pacific/Niue'), ('Pacific/Pago_Pago', '(GMT-1100) Pacific/Pago_Pago'), ('Pacific/Honolulu', '(GMT-1000) Pacific/Honolulu'), ('Pacific/Johnston', '(GMT-1000) Pacific/Johnston'), ('Pacific/Rarotonga', '(GMT-1000) Pacific/Rarotonga'), ('Pacific/Tahiti', '(GMT-1000) Pacific/Tahiti'), ('US/Hawaii', '(GMT-1000) US/Hawaii'), ('Pacific/Marquesas', '(GMT-0930) Pacific/Marquesas'), ('America/Adak', '(GMT-0900) America/Adak'), ('Pacific/Gambier', '(GMT-0900) Pacific/Gambier'), ('America/Anchorage', '(GMT-0800) America/Anchorage'), ('America/Juneau', '(GMT-0800) America/Juneau'), ('America/Metlakatla', '(GMT-0800) America/Metlakatla'), ('America/Nome', '(GMT-0800) America/Nome'), ('America/Sitka', '(GMT-0800) America/Sitka'), ('America/Yakutat', '(GMT-0800) America/Yakutat'), ('Pacific/Pitcairn', '(GMT-0800) Pacific/Pitcairn'), ('US/Alaska', '(GMT-0800) US/Alaska'), ('America/Chihuahua', '(GMT-0700) America/Chihuahua'), ('America/Creston', '(GMT-0700) America/Creston'), ('America/Dawson', '(GMT-0700) America/Dawson'), ('America/Dawson_Creek', '(GMT-0700) America/Dawson_Creek'), ('America/Fort_Nelson', '(GMT-0700) America/Fort_Nelson'), ('America/Hermosillo', '(GMT-0700) America/Hermosillo'), ('America/Los_Angeles', '(GMT-0700) America/Los_Angeles'), ('America/Mazatlan', '(GMT-0700) America/Mazatlan'), ('America/Phoenix', '(GMT-0700) America/Phoenix'), ('America/Tijuana', '(GMT-0700) America/Tijuana'), ('America/Vancouver', '(GMT-0700) America/Vancouver'), ('America/Whitehorse', '(GMT-0700) America/Whitehorse'), ('Canada/Pacific', '(GMT-0700) Canada/Pacific'), ('US/Arizona', '(GMT-0700) US/Arizona'), ('US/Pacific', '(GMT-0700) US/Pacific'), ('America/Bahia_Banderas', '(GMT-0600) America/Bahia_Banderas'), ('America/Belize', '(GMT-0600) America/Belize'), ('America/Boise', '(GMT-0600) America/Boise'), ('America/Cambridge_Bay', '(GMT-0600) America/Cambridge_Bay'), ('America/Costa_Rica', '(GMT-0600) America/Costa_Rica'), ('America/Denver', '(GMT-0600) America/Denver'), ('America/Edmonton', '(GMT-0600) America/Edmonton'), ('America/El_Salvador', '(GMT-0600) America/El_Salvador'), ('America/Guatemala', '(GMT-0600) America/Guatemala'), ('America/Inuvik', '(GMT-0600) America/Inuvik'), ('America/Managua', '(GMT-0600) America/Managua'), ('America/Merida', '(GMT-0600) America/Merida'), ('America/Mexico_City', '(GMT-0600) America/Mexico_City'), ('America/Monterrey', '(GMT-0600) America/Monterrey'), ('America/Ojinaga', '(GMT-0600) America/Ojinaga'), ('America/Regina', '(GMT-0600) America/Regina'), ('America/Swift_Current', '(GMT-0600) America/Swift_Current'), ('America/Tegucigalpa', '(GMT-0600) America/Tegucigalpa'), ('America/Yellowknife', '(GMT-0600) America/Yellowknife'), ('Canada/Mountain', '(GMT-0600) Canada/Mountain'), ('Pacific/Galapagos', '(GMT-0600) Pacific/Galapagos'), ('US/Mountain', '(GMT-0600) US/Mountain'), ('America/Atikokan', '(GMT-0500) America/Atikokan'), ('America/Bogota', '(GMT-0500) America/Bogota'), ('America/Cancun', '(GMT-0500) America/Cancun'), ('America/Cayman', '(GMT-0500) America/Cayman'), ('America/Chicago', '(GMT-0500) America/Chicago'), ('America/Eirunepe', '(GMT-0500) America/Eirunepe'), ('America/Guayaquil', '(GMT-0500) America/Guayaquil'), ('America/Indiana/Knox', '(GMT-0500) America/Indiana/Knox'), ('America/Indiana/Tell_City', '(GMT-0500) America/Indiana/Tell_City'), ('America/Jamaica', '(GMT-0500) America/Jamaica'), ('America/Lima', '(GMT-0500) America/Lima'), ('America/Matamoros', '(GMT-0500) America/Matamoros'), ('America/Menominee', '(GMT-0500) America/Menominee'), ('America/North_Dakota/Beulah', '(GMT-0500) America/North_Dakota/Beulah'), ('America/North_Dakota/Center', '(GMT-0500) America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', '(GMT-0500) America/North_Dakota/New_Salem'), ('America/Panama', '(GMT-0500) America/Panama'), ('America/Port-au-Prince', '(GMT-0500) America/Port-au-Prince'), ('America/Rainy_River', '(GMT-0500) America/Rainy_River'), ('America/Rankin_Inlet', '(GMT-0500) America/Rankin_Inlet'), ('America/Resolute', '(GMT-0500) America/Resolute'), ('America/Rio_Branco', '(GMT-0500) America/Rio_Branco'), ('America/Winnipeg', '(GMT-0500) America/Winnipeg'), ('Canada/Central', '(GMT-0500) Canada/Central'), ('Pacific/Easter', '(GMT-0500) Pacific/Easter'), ('US/Central', '(GMT-0500) US/Central'), ('America/Anguilla', '(GMT-0400) America/Anguilla'), ('America/Antigua', '(GMT-0400) America/Antigua'), ('America/Aruba', '(GMT-0400) America/Aruba'), ('America/Asuncion', '(GMT-0400) America/Asuncion'), ('America/Barbados', '(GMT-0400) America/Barbados'), ('America/Blanc-Sablon', '(GMT-0400) America/Blanc-Sablon'), ('America/Boa_Vista', '(GMT-0400) America/Boa_Vista'), ('America/Campo_Grande', '(GMT-0400) America/Campo_Grande'), ('America/Caracas', '(GMT-0400) America/Caracas'), ('America/Cuiaba', '(GMT-0400) America/Cuiaba'), ('America/Curacao', '(GMT-0400) America/Curacao'), ('America/Detroit', '(GMT-0400) America/Detroit'), ('America/Dominica', '(GMT-0400) America/Dominica'), ('America/Grand_Turk', '(GMT-0400) America/Grand_Turk'), ('America/Grenada', '(GMT-0400) America/Grenada'), ('America/Guadeloupe', '(GMT-0400) America/Guadeloupe'), ('America/Guyana', '(GMT-0400) America/Guyana'), ('America/Havana', '(GMT-0400) America/Havana'), ('America/Indiana/Indianapolis', '(GMT-0400) America/Indiana/Indianapolis'), ('America/Indiana/Marengo', '(GMT-0400) America/Indiana/Marengo'), ('America/Indiana/Petersburg', '(GMT-0400) America/Indiana/Petersburg'), ('America/Indiana/Vevay', '(GMT-0400) America/Indiana/Vevay'), ('America/Indiana/Vincennes', '(GMT-0400) America/Indiana/Vincennes'), ('America/Indiana/Winamac', '(GMT-0400) America/Indiana/Winamac'), ('America/Iqaluit', '(GMT-0400) America/Iqaluit'), ('America/Kentucky/Louisville', '(GMT-0400) America/Kentucky/Louisville'), ('America/Kentucky/Monticello', '(GMT-0400) America/Kentucky/Monticello'), ('America/Kralendijk', '(GMT-0400) America/Kralendijk'), ('America/La_Paz', '(GMT-0400) America/La_Paz'), ('America/Lower_Princes', '(GMT-0400) America/Lower_Princes'), ('America/Manaus', '(GMT-0400) America/Manaus'), ('America/Marigot', '(GMT-0400) America/Marigot'), ('America/Martinique', '(GMT-0400) America/Martinique'), ('America/Montserrat', '(GMT-0400) America/Montserrat'), ('America/Nassau', '(GMT-0400) America/Nassau'), ('America/New_York', '(GMT-0400) America/New_York'), ('America/Nipigon', '(GMT-0400) America/Nipigon'), ('America/Pangnirtung', '(GMT-0400) America/Pangnirtung'), ('America/Port_of_Spain', '(GMT-0400) America/Port_of_Spain'), ('America/Porto_Velho', '(GMT-0400) America/Porto_Velho'), ('America/Puerto_Rico', '(GMT-0400) America/Puerto_Rico'), ('America/Santo_Domingo', '(GMT-0400) America/Santo_Domingo'), ('America/St_Barthelemy', '(GMT-0400) America/St_Barthelemy'), ('America/St_Kitts', '(GMT-0400) America/St_Kitts'), ('America/St_Lucia', '(GMT-0400) America/St_Lucia'), ('America/St_Thomas', '(GMT-0400) America/St_Thomas'), ('America/St_Vincent', '(GMT-0400) America/St_Vincent'), ('America/Thunder_Bay', '(GMT-0400) America/Thunder_Bay'), ('America/Toronto', '(GMT-0400) America/Toronto'), ('America/Tortola', '(GMT-0400) America/Tortola'), ('Canada/Eastern', '(GMT-0400) Canada/Eastern'), ('US/Eastern', '(GMT-0400) US/Eastern'), ('America/Araguaina', '(GMT-0300) America/Araguaina'), ('America/Argentina/Buenos_Aires', '(GMT-0300) America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', '(GMT-0300) America/Argentina/Catamarca'), ('America/Argentina/Cordoba', '(GMT-0300) America/Argentina/Cordoba'), ('America/Argentina/Jujuy', '(GMT-0300) America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', '(GMT-0300) America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', '(GMT-0300) America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', '(GMT-0300) America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', '(GMT-0300) America/Argentina/Salta'), ('America/Argentina/San_Juan', '(GMT-0300) America/Argentina/San_Juan'), ('America/Argentina/San_Luis', '(GMT-0300) America/Argentina/San_Luis'), ('America/Argentina/Tucuman', '(GMT-0300) America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', '(GMT-0300) America/Argentina/Ushuaia'), ('America/Bahia', '(GMT-0300) America/Bahia'), ('America/Belem', '(GMT-0300) America/Belem'), ('America/Cayenne', '(GMT-0300) America/Cayenne'), ('America/Fortaleza', '(GMT-0300) America/Fortaleza'), ('America/Glace_Bay', '(GMT-0300) America/Glace_Bay'), ('America/Goose_Bay', '(GMT-0300) America/Goose_Bay'), ('America/Halifax', '(GMT-0300) America/Halifax'), ('America/Maceio', '(GMT-0300) America/Maceio'), ('America/Moncton', '(GMT-0300) America/Moncton'), ('America/Montevideo', '(GMT-0300) America/Montevideo'), ('America/Paramaribo', '(GMT-0300) America/Paramaribo'), ('America/Recife', '(GMT-0300) America/Recife'), ('America/Santarem', '(GMT-0300) America/Santarem'), ('America/Santiago', '(GMT-0300) America/Santiago'), ('America/Sao_Paulo', '(GMT-0300) America/Sao_Paulo'), ('America/Thule', '(GMT-0300) America/Thule'), ('Antarctica/Palmer', '(GMT-0300) Antarctica/Palmer'), ('Antarctica/Rothera', '(GMT-0300) Antarctica/Rothera'), ('Atlantic/Bermuda', '(GMT-0300) Atlantic/Bermuda'), ('Atlantic/Stanley', '(GMT-0300) Atlantic/Stanley'), ('Canada/Atlantic', '(GMT-0300) Canada/Atlantic'), ('America/St_Johns', '(GMT-0230) America/St_Johns'), ('Canada/Newfoundland', '(GMT-0230) Canada/Newfoundland'), ('America/Godthab', '(GMT-0200) America/Godthab'), ('America/Miquelon', '(GMT-0200) America/Miquelon'), ('America/Noronha', '(GMT-0200) America/Noronha'), ('Atlantic/South_Georgia', '(GMT-0200) Atlantic/South_Georgia'), ('Atlantic/Cape_Verde', '(GMT-0100) Atlantic/Cape_Verde'), ('Africa/Abidjan', '(GMT+0000) Africa/Abidjan'), ('Africa/Accra', '(GMT+0000) Africa/Accra'), ('Africa/Bamako', '(GMT+0000) Africa/Bamako'), ('Africa/Banjul', '(GMT+0000) Africa/Banjul'), ('Africa/Bissau', '(GMT+0000) Africa/Bissau'), ('Africa/Conakry', '(GMT+0000) Africa/Conakry'), ('Africa/Dakar', '(GMT+0000) Africa/Dakar'), ('Africa/Freetown', '(GMT+0000) Africa/Freetown'), ('Africa/Lome', '(GMT+0000) Africa/Lome'), ('Africa/Monrovia', '(GMT+0000) Africa/Monrovia'), ('Africa/Nouakchott', '(GMT+0000) Africa/Nouakchott'), ('Africa/Ouagadougou', '(GMT+0000) Africa/Ouagadougou'), ('Africa/Sao_Tome', '(GMT+0000) Africa/Sao_Tome'), ('America/Danmarkshavn', '(GMT+0000) America/Danmarkshavn'), ('America/Scoresbysund', '(GMT+0000) America/Scoresbysund'), ('Atlantic/Azores', '(GMT+0000) Atlantic/Azores'), ('Atlantic/Reykjavik', '(GMT+0000) Atlantic/Reykjavik'), ('Atlantic/St_Helena', '(GMT+0000) Atlantic/St_Helena'), ('GMT', '(GMT+0000) GMT'), ('UTC', '(GMT+0000) UTC'), ('Africa/Algiers', '(GMT+0100) Africa/Algiers'), ('Africa/Bangui', '(GMT+0100) Africa/Bangui'), ('Africa/Brazzaville', '(GMT+0100) Africa/Brazzaville'), ('Africa/Casablanca', '(GMT+0100) Africa/Casablanca'), ('Africa/Douala', '(GMT+0100) Africa/Douala'), ('Africa/El_Aaiun', '(GMT+0100) Africa/El_Aaiun'), ('Africa/Kinshasa', '(GMT+0100) Africa/Kinshasa'), ('Africa/Lagos', '(GMT+0100) Africa/Lagos'), ('Africa/Libreville', '(GMT+0100) Africa/Libreville'), ('Africa/Luanda', '(GMT+0100) Africa/Luanda'), ('Africa/Malabo', '(GMT+0100) Africa/Malabo'), ('Africa/Ndjamena', '(GMT+0100) Africa/Ndjamena'), ('Africa/Niamey', '(GMT+0100) Africa/Niamey'), ('Africa/Porto-Novo', '(GMT+0100) Africa/Porto-Novo'), ('Africa/Tunis', '(GMT+0100) Africa/Tunis'), ('Atlantic/Canary', '(GMT+0100) Atlantic/Canary'), ('Atlantic/Faroe', '(GMT+0100) Atlantic/Faroe'), ('Atlantic/Madeira', '(GMT+0100) Atlantic/Madeira'), ('Europe/Dublin', '(GMT+0100) Europe/Dublin'), ('Europe/Guernsey', '(GMT+0100) Europe/Guernsey'), ('Europe/Isle_of_Man', '(GMT+0100) Europe/Isle_of_Man'), ('Europe/Jersey', '(GMT+0100) Europe/Jersey'), ('Europe/Lisbon', '(GMT+0100) Europe/Lisbon'), ('Europe/London', '(GMT+0100) Europe/London'), ('Africa/Blantyre', '(GMT+0200) Africa/Blantyre'), ('Africa/Bujumbura', '(GMT+0200) Africa/Bujumbura'), ('Africa/Cairo', '(GMT+0200) Africa/Cairo'), ('Africa/Ceuta', '(GMT+0200) Africa/Ceuta'), ('Africa/Gaborone', '(GMT+0200) Africa/Gaborone'), ('Africa/Harare', '(GMT+0200) Africa/Harare'), ('Africa/Johannesburg', '(GMT+0200) Africa/Johannesburg'), ('Africa/Kigali', '(GMT+0200) Africa/Kigali'), ('Africa/Lubumbashi', '(GMT+0200) Africa/Lubumbashi'), ('Africa/Lusaka', '(GMT+0200) Africa/Lusaka'), ('Africa/Maputo', '(GMT+0200) Africa/Maputo'), ('Africa/Maseru', '(GMT+0200) Africa/Maseru'), ('Africa/Mbabane', '(GMT+0200) Africa/Mbabane'), ('Africa/Tripoli', '(GMT+0200) Africa/Tripoli'), ('Africa/Windhoek', '(GMT+0200) Africa/Windhoek'), ('Antarctica/Troll', '(GMT+0200) Antarctica/Troll'), ('Arctic/Longyearbyen', '(GMT+0200) Arctic/Longyearbyen'), ('Asia/Amman', '(GMT+0200) Asia/Amman'), ('Asia/Damascus', '(GMT+0200) Asia/Damascus'), ('Europe/Amsterdam', '(GMT+0200) Europe/Amsterdam'), ('Europe/Andorra', '(GMT+0200) Europe/Andorra'), ('Europe/Belgrade', '(GMT+0200) Europe/Belgrade'), ('Europe/Berlin', '(GMT+0200) Europe/Berlin'), ('Europe/Bratislava', '(GMT+0200) Europe/Bratislava'), ('Europe/Brussels', '(GMT+0200) Europe/Brussels'), ('Europe/Budapest', '(GMT+0200) Europe/Budapest'), ('Europe/Busingen', '(GMT+0200) Europe/Busingen'), ('Europe/Copenhagen', '(GMT+0200) Europe/Copenhagen'), ('Europe/Gibraltar', '(GMT+0200) Europe/Gibraltar'), ('Europe/Kaliningrad', '(GMT+0200) Europe/Kaliningrad'), ('Europe/Ljubljana', '(GMT+0200) Europe/Ljubljana'), ('Europe/Luxembourg', '(GMT+0200) Europe/Luxembourg'), ('Europe/Madrid', '(GMT+0200) Europe/Madrid'), ('Europe/Malta', '(GMT+0200) Europe/Malta'), ('Europe/Monaco', '(GMT+0200) Europe/Monaco'), ('Europe/Oslo', '(GMT+0200) Europe/Oslo'), ('Europe/Paris', '(GMT+0200) Europe/Paris'), ('Europe/Podgorica', '(GMT+0200) Europe/Podgorica'), ('Europe/Prague', '(GMT+0200) Europe/Prague'), ('Europe/Rome', '(GMT+0200) Europe/Rome'), ('Europe/San_Marino', '(GMT+0200) Europe/San_Marino'), ('Europe/Sarajevo', '(GMT+0200) Europe/Sarajevo'), ('Europe/Skopje', '(GMT+0200) Europe/Skopje'), ('Europe/Stockholm', '(GMT+0200) Europe/Stockholm'), ('Europe/Tirane', '(GMT+0200) Europe/Tirane'), ('Europe/Vaduz', '(GMT+0200) Europe/Vaduz'), ('Europe/Vatican', '(GMT+0200) Europe/Vatican'), ('Europe/Vienna', '(GMT+0200) Europe/Vienna'), ('Europe/Warsaw', '(GMT+0200) Europe/Warsaw'), ('Europe/Zagreb', '(GMT+0200) Europe/Zagreb'), ('Europe/Zurich', '(GMT+0200) Europe/Zurich'), ('Africa/Addis_Ababa', '(GMT+0300) Africa/Addis_Ababa'), ('Africa/Asmara', '(GMT+0300) Africa/Asmara'), ('Africa/Dar_es_Salaam', '(GMT+0300) Africa/Dar_es_Salaam'), ('Africa/Djibouti', '(GMT+0300) Africa/Djibouti'), ('Africa/Juba', '(GMT+0300) Africa/Juba'), ('Africa/Kampala', '(GMT+0300) Africa/Kampala'), ('Africa/Khartoum', '(GMT+0300) Africa/Khartoum'), ('Africa/Mogadishu', '(GMT+0300) Africa/Mogadishu'), ('Africa/Nairobi', '(GMT+0300) Africa/Nairobi'), ('Antarctica/Syowa', '(GMT+0300) Antarctica/Syowa'), ('Asia/Aden', '(GMT+0300) Asia/Aden'), ('Asia/Baghdad', '(GMT+0300) Asia/Baghdad'), ('Asia/Bahrain', '(GMT+0300) Asia/Bahrain'), ('Asia/Beirut', '(GMT+0300) Asia/Beirut'), ('Asia/Gaza', '(GMT+0300) Asia/Gaza'), ('Asia/Hebron', '(GMT+0300) Asia/Hebron'), ('Asia/Jerusalem', '(GMT+0300) Asia/Jerusalem'), ('Asia/Kuwait', '(GMT+0300) Asia/Kuwait'), ('Asia/Nicosia', '(GMT+0300) Asia/Nicosia'), ('Asia/Qatar', '(GMT+0300) Asia/Qatar'), ('Asia/Riyadh', '(GMT+0300) Asia/Riyadh'), ('Europe/Athens', '(GMT+0300) Europe/Athens'), ('Europe/Bucharest', '(GMT+0300) Europe/Bucharest'), ('Europe/Chisinau', '(GMT+0300) Europe/Chisinau'), ('Europe/Helsinki', '(GMT+0300) Europe/Helsinki'), ('Europe/Istanbul', '(GMT+0300) Europe/Istanbul'), ('Europe/Kiev', '(GMT+0300) Europe/Kiev'), ('Europe/Kirov', '(GMT+0300) Europe/Kirov'), ('Europe/Mariehamn', '(GMT+0300) Europe/Mariehamn'), ('Europe/Minsk', '(GMT+0300) Europe/Minsk'), ('Europe/Moscow', '(GMT+0300) Europe/Moscow'), ('Europe/Riga', '(GMT+0300) Europe/Riga'), ('Europe/Simferopol', '(GMT+0300) Europe/Simferopol'), ('Europe/Sofia', '(GMT+0300) Europe/Sofia'), ('Europe/Tallinn', '(GMT+0300) Europe/Tallinn'), ('Europe/Uzhgorod', '(GMT+0300) Europe/Uzhgorod'), ('Europe/Vilnius', '(GMT+0300) Europe/Vilnius'), ('Europe/Volgograd', '(GMT+0300) Europe/Volgograd'), ('Europe/Zaporozhye', '(GMT+0300) Europe/Zaporozhye'), ('Indian/Antananarivo', '(GMT+0300) Indian/Antananarivo'), ('Indian/Comoro', '(GMT+0300) Indian/Comoro'), ('Indian/Mayotte', '(GMT+0300) Indian/Mayotte'), ('Asia/Baku', '(GMT+0400) Asia/Baku'), ('Asia/Dubai', '(GMT+0400) Asia/Dubai'), ('Asia/Muscat', '(GMT+0400) Asia/Muscat'), ('Asia/Tbilisi', '(GMT+0400) Asia/Tbilisi'), ('Asia/Yerevan', '(GMT+0400) Asia/Yerevan'), ('Europe/Astrakhan', '(GMT+0400) Europe/Astrakhan'), ('Europe/Samara', '(GMT+0400) Europe/Samara'), ('Europe/Ulyanovsk', '(GMT+0400) Europe/Ulyanovsk'), ('Indian/Mahe', '(GMT+0400) Indian/Mahe'), ('Indian/Mauritius', '(GMT+0400) Indian/Mauritius'), ('Indian/Reunion', '(GMT+0400) Indian/Reunion'), ('Asia/Kabul', '(GMT+0430) Asia/Kabul'), ('Asia/Tehran', '(GMT+0430) Asia/Tehran'), ('Antarctica/Mawson', '(GMT+0500) Antarctica/Mawson'), ('Asia/Aqtau', '(GMT+0500) Asia/Aqtau'), ('Asia/Aqtobe', '(GMT+0500) Asia/Aqtobe'), ('Asia/Ashgabat', '(GMT+0500) Asia/Ashgabat'), ('Asia/Dushanbe', '(GMT+0500) Asia/Dushanbe'), ('Asia/Karachi', '(GMT+0500) Asia/Karachi'), ('Asia/Oral', '(GMT+0500) Asia/Oral'), ('Asia/Samarkand', '(GMT+0500) Asia/Samarkand'), ('Asia/Tashkent', '(GMT+0500) Asia/Tashkent'), ('Asia/Yekaterinburg', '(GMT+0500) Asia/Yekaterinburg'), ('Indian/Kerguelen', '(GMT+0500) Indian/Kerguelen'), ('Indian/Maldives', '(GMT+0500) Indian/Maldives'), ('Asia/Colombo', '(GMT+0530) Asia/Colombo'), ('Asia/Kolkata', '(GMT+0530) Asia/Kolkata'), ('Asia/Kathmandu', '(GMT+0545) Asia/Kathmandu'), ('Antarctica/Vostok', '(GMT+0600) Antarctica/Vostok'), ('Asia/Almaty', '(GMT+0600) Asia/Almaty'), ('Asia/Bishkek', '(GMT+0600) Asia/Bishkek'), ('Asia/Dhaka', '(GMT+0600) Asia/Dhaka'), ('Asia/Omsk', '(GMT+0600) Asia/Omsk'), ('Asia/Qyzylorda', '(GMT+0600) Asia/Qyzylorda'), ('Asia/Thimphu', '(GMT+0600) Asia/Thimphu'), ('Asia/Urumqi', '(GMT+0600) Asia/Urumqi'), ('Indian/Chagos', '(GMT+0600) Indian/Chagos'), ('Asia/Rangoon', '(GMT+0630) Asia/Rangoon'), ('Indian/Cocos', '(GMT+0630) Indian/Cocos'), ('Antarctica/Davis', '(GMT+0700) Antarctica/Davis'), ('Asia/Bangkok', '(GMT+0700) Asia/Bangkok'), ('Asia/Barnaul', '(GMT+0700) Asia/Barnaul'), ('Asia/Ho_Chi_Minh', '(GMT+0700) Asia/Ho_Chi_Minh'), ('Asia/Jakarta', '(GMT+0700) Asia/Jakarta'), ('Asia/Krasnoyarsk', '(GMT+0700) Asia/Krasnoyarsk'), ('Asia/Novokuznetsk', '(GMT+0700) Asia/Novokuznetsk'), ('Asia/Novosibirsk', '(GMT+0700) Asia/Novosibirsk'), ('Asia/Phnom_Penh', '(GMT+0700) Asia/Phnom_Penh'), ('Asia/Pontianak', '(GMT+0700) Asia/Pontianak'), ('Asia/Tomsk', '(GMT+0700) Asia/Tomsk'), ('Asia/Vientiane', '(GMT+0700) Asia/Vientiane'), ('Indian/Christmas', '(GMT+0700) Indian/Christmas'), ('Antarctica/Casey', '(GMT+0800) Antarctica/Casey'), ('Asia/Brunei', '(GMT+0800) Asia/Brunei'), ('Asia/Hong_Kong', '(GMT+0800) Asia/Hong_Kong'), ('Asia/Hovd', '(GMT+0800) Asia/Hovd'), ('Asia/Irkutsk', '(GMT+0800) Asia/Irkutsk'), ('Asia/Kuala_Lumpur', '(GMT+0800) Asia/Kuala_Lumpur'), ('Asia/Kuching', '(GMT+0800) Asia/Kuching'), ('Asia/Macau', '(GMT+0800) Asia/Macau'), ('Asia/Makassar', '(GMT+0800) Asia/Makassar'), ('Asia/Manila', '(GMT+0800) Asia/Manila'), ('Asia/Shanghai', '(GMT+0800) Asia/Shanghai'), ('Asia/Singapore', '(GMT+0800) Asia/Singapore'), ('Asia/Taipei', '(GMT+0800) Asia/Taipei'), ('Australia/Perth', '(GMT+0800) Australia/Perth'), ('Asia/Pyongyang', '(GMT+0830) Asia/Pyongyang'), ('Australia/Eucla', '(GMT+0845) Australia/Eucla'), ('Asia/Chita', '(GMT+0900) Asia/Chita'), ('Asia/Choibalsan', '(GMT+0900) Asia/Choibalsan'), ('Asia/Dili', '(GMT+0900) Asia/Dili'), ('Asia/Jayapura', '(GMT+0900) Asia/Jayapura'), ('Asia/Khandyga', '(GMT+0900) Asia/Khandyga'), ('Asia/Seoul', '(GMT+0900) Asia/Seoul'), ('Asia/Tokyo', '(GMT+0900) Asia/Tokyo'), ('Asia/Ulaanbaatar', '(GMT+0900) Asia/Ulaanbaatar'), ('Asia/Yakutsk', '(GMT+0900) Asia/Yakutsk'), ('Pacific/Palau', '(GMT+0900) Pacific/Palau'), ('Australia/Darwin', '(GMT+0930) Australia/Darwin'), ('Antarctica/DumontDUrville', '(GMT+1000) Antarctica/DumontDUrville'), ('Asia/Ust-Nera', '(GMT+1000) Asia/Ust-Nera'), ('Asia/Vladivostok', '(GMT+1000) Asia/Vladivostok'), ('Australia/Brisbane', '(GMT+1000) Australia/Brisbane'), ('Australia/Lindeman', '(GMT+1000) Australia/Lindeman'), ('Pacific/Chuuk', '(GMT+1000) Pacific/Chuuk'), ('Pacific/Guam', '(GMT+1000) Pacific/Guam'), ('Pacific/Port_Moresby', '(GMT+1000) Pacific/Port_Moresby'), ('Pacific/Saipan', '(GMT+1000) Pacific/Saipan'), ('Australia/Adelaide', '(GMT+1030) Australia/Adelaide'), ('Australia/Broken_Hill', '(GMT+1030) Australia/Broken_Hill'), ('Antarctica/Macquarie', '(GMT+1100) Antarctica/Macquarie'), ('Asia/Magadan', '(GMT+1100) Asia/Magadan'), ('Asia/Sakhalin', '(GMT+1100) Asia/Sakhalin'), ('Asia/Srednekolymsk', '(GMT+1100) Asia/Srednekolymsk'), ('Australia/Currie', '(GMT+1100) Australia/Currie'), ('Australia/Hobart', '(GMT+1100) Australia/Hobart'), ('Australia/Lord_Howe', '(GMT+1100) Australia/Lord_Howe'), ('Australia/Melbourne', '(GMT+1100) Australia/Melbourne'), ('Australia/Sydney', '(GMT+1100) Australia/Sydney'), ('Pacific/Bougainville', '(GMT+1100) Pacific/Bougainville'), ('Pacific/Efate', '(GMT+1100) Pacific/Efate'), ('Pacific/Guadalcanal', '(GMT+1100) Pacific/Guadalcanal'), ('Pacific/Kosrae', '(GMT+1100) Pacific/Kosrae'), ('Pacific/Norfolk', '(GMT+1100) Pacific/Norfolk'), ('Pacific/Noumea', '(GMT+1100) Pacific/Noumea'), ('Pacific/Pohnpei', '(GMT+1100) Pacific/Pohnpei'), ('Asia/Anadyr', '(GMT+1200) Asia/Anadyr'), ('Asia/Kamchatka', '(GMT+1200) Asia/Kamchatka'), ('Pacific/Fiji', '(GMT+1200) Pacific/Fiji'), ('Pacific/Funafuti', '(GMT+1200) Pacific/Funafuti'), ('Pacific/Kwajalein', '(GMT+1200) Pacific/Kwajalein'), ('Pacific/Majuro', '(GMT+1200) Pacific/Majuro'), ('Pacific/Nauru', '(GMT+1200) Pacific/Nauru'), ('Pacific/Tarawa', '(GMT+1200) Pacific/Tarawa'), ('Pacific/Wake', '(GMT+1200) Pacific/Wake'), ('Pacific/Wallis', '(GMT+1200) Pacific/Wallis'), ('Antarctica/McMurdo', '(GMT+1300) Antarctica/McMurdo'), ('Pacific/Auckland', '(GMT+1300) Pacific/Auckland'), ('Pacific/Enderbury', '(GMT+1300) Pacific/Enderbury'), ('Pacific/Fakaofo', '(GMT+1300) Pacific/Fakaofo'), ('Pacific/Tongatapu', '(GMT+1300) Pacific/Tongatapu'), ('Pacific/Chatham', '(GMT+1345) Pacific/Chatham'), ('Pacific/Apia', '(GMT+1400) Pacific/Apia'), ('Pacific/Kiritimati', '(GMT+1400) Pacific/Kiritimati')]", max_length = 100, blank = False, null = False, db_index = False];
-}
diff --git a/xos/genx/xprotos/core/usercredential.xproto b/xos/genx/xprotos/core/usercredential.xproto
index 21dd1a3..22fc83c 100644
--- a/xos/genx/xprotos/core/usercredential.xproto
+++ b/xos/genx/xprotos/core/usercredential.xproto
@@ -1,6 +1,6 @@
-message UserCredential {
+message UserCredential (PlCoreBase){
required manytoone user->User:usercredentials = 1 [help_text = "The User this credential is associated with", null = False, db_index = True, blank = False];
required string name = 2 [help_text = "The credential type, e.g. ec2", max_length = 128, null = False, db_index = True, blank = False];
required string key_id = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "The backend id of this credential", null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/userdashboardview.xproto b/xos/genx/xprotos/core/userdashboardview.xproto
deleted file mode 100644
index 65a4a96..0000000
--- a/xos/genx/xprotos/core/userdashboardview.xproto
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-message UserDashboardView {
- required manytoone user->User:userdashboardviews = 1 [db_index = True, null = False, blank = False];
- required manytoone dashboardView->DashboardView:userdashboardviews = 2 [db_index = True, null = False, blank = False];
- required int32 order = 3 [default = 0, null = False, db_index = False, blank = False];
-}
diff --git a/xos/genx/xprotos/core/xos.xproto b/xos/genx/xprotos/core/xos.xproto
index 409c513..8f0d60f 100644
--- a/xos/genx/xprotos/core/xos.xproto
+++ b/xos/genx/xprotos/core/xos.xproto
@@ -1,6 +1,6 @@
-message XOS {
+message XOS (PlCoreBase){
required string name = 1 [default = "XOS", max_length = 200, content_type = "stripped", blank = False, help_text = "Name of XOS", null = False, db_index = False];
required int32 ui_port = 2 [help_text = "Port for XOS UI", default = 80, null = False, db_index = False, blank = False];
required int32 bootstrap_ui_port = 3 [help_text = "Port for XOS Bootstrap UI", default = 81, null = False, db_index = False, blank = False];
diff --git a/xos/genx/xprotos/core/xoscomponent.xproto b/xos/genx/xprotos/core/xoscomponent.xproto
index eb0aefd..057529a 100644
--- a/xos/genx/xprotos/core/xoscomponent.xproto
+++ b/xos/genx/xprotos/core/xoscomponent.xproto
@@ -1,15 +1,9 @@
-message XOSComponent {
- required manytoone xos->XOS:loadable_modules = 1 [help_text = "Pointer to XOS", default = "get_xos()", null = False, db_index = True, blank = False];
- required string name = 2 [max_length = 30, content_type = "stripped", blank = False, help_text = "Service Name", null = False, db_index = False];
- optional string base_url = 3 [max_length = 1024, content_type = "stripped", blank = True, help_text = "Base URL, allows use of relative URLs for resources", null = True, db_index = False];
- optional string version = 4 [default = "1.0.0", max_length = 30, content_type = "stripped", blank = True, help_text = "Version of Service Controller", null = True, db_index = False];
- optional string provides = 5 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of things provided", null = True, db_index = False];
- optional string requires = 6 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of required Service Controllers", null = True, db_index = False];
- required string image = 7 [max_length = 200, content_type = "stripped", blank = False, help_text = "docker image name", null = False, db_index = False];
- optional string command = 8 [max_length = 1024, content_type = "stripped", blank = True, help_text = "docker run command", null = True, db_index = False];
- optional string ports = 9 [max_length = 200, content_type = "stripped", blank = True, help_text = "port binding", null = True, db_index = False];
- optional string extra = 10 [max_length = 200, content_type = "stripped", blank = True, help_text = "extra information needed by containers", null = True, db_index = False];
- required bool no_start = 11 [help_text = "Do not start the Component", default = False, null = False, db_index = False, blank = True];
+message XOSComponent (LoadableModule){
+ required string image = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "docker image name", null = False, db_index = False];
+ optional string command = 2 [max_length = 1024, content_type = "stripped", blank = True, help_text = "docker run command", null = True, db_index = False];
+ optional string ports = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "port binding", null = True, db_index = False];
+ optional string extra = 4 [max_length = 200, content_type = "stripped", blank = True, help_text = "extra information needed by containers", null = True, db_index = False];
+ required bool no_start = 5 [help_text = "Do not start the Component", default = False, null = False, db_index = False, blank = True];
}
diff --git a/xos/genx/xprotos/core/xoscomponentlink.xproto b/xos/genx/xprotos/core/xoscomponentlink.xproto
index 9e3b8db..5d95bf0 100644
--- a/xos/genx/xprotos/core/xoscomponentlink.xproto
+++ b/xos/genx/xprotos/core/xoscomponentlink.xproto
@@ -1,6 +1,6 @@
-message XOSComponentLink {
+message XOSComponentLink (PlCoreBase){
required manytoone component->XOSComponent:links = 1 [help_text = "The Component object for this Link", null = False, db_index = True, blank = False];
required string container = 2 [max_length = 200, content_type = "stripped", blank = False, help_text = "container to link", null = False, db_index = False];
required string alias = 3 [max_length = 200, content_type = "stripped", blank = False, help_text = "alias for the link", null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/xoscomponentvolume.xproto b/xos/genx/xprotos/core/xoscomponentvolume.xproto
index 9ed9af1..c1f7e91 100644
--- a/xos/genx/xprotos/core/xoscomponentvolume.xproto
+++ b/xos/genx/xprotos/core/xoscomponentvolume.xproto
@@ -1,6 +1,6 @@
-message XOSComponentVolume {
+message XOSComponentVolume (PlCoreBase){
required manytoone component->XOSComponent:volumes = 1 [help_text = "The Component object for this Volume", null = False, db_index = True, blank = False];
required string name = 2 [max_length = 300, content_type = "stripped", blank = False, help_text = "Volume Name", null = False, db_index = False];
required string container_path = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "Path of Volume in Container", null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/xoscomponentvolumecontainer.xproto b/xos/genx/xprotos/core/xoscomponentvolumecontainer.xproto
index acf36a8..a8c8223 100644
--- a/xos/genx/xprotos/core/xoscomponentvolumecontainer.xproto
+++ b/xos/genx/xprotos/core/xoscomponentvolumecontainer.xproto
@@ -1,6 +1,6 @@
-message XOSComponentVolumeContainer {
+message XOSComponentVolumeContainer (PlCoreBase){
required manytoone component->XOSComponent:volumecontainers = 1 [help_text = "The Component object for this VolumeContainer", null = False, db_index = True, blank = False];
required string name = 2 [max_length = 300, content_type = "stripped", blank = False, help_text = "Volume Name", null = False, db_index = False];
required string container = 3 [max_length = 300, content_type = "stripped", blank = False, help_text = "Volume Name", null = False, db_index = False];
diff --git a/xos/genx/xprotos/core/xosguiextension.xproto b/xos/genx/xprotos/core/xosguiextension.xproto
index d15cf64..774de4e 100644
--- a/xos/genx/xprotos/core/xosguiextension.xproto
+++ b/xos/genx/xprotos/core/xosguiextension.xproto
@@ -1,6 +1,6 @@
-message XOSGuiExtension {
+message XOSGuiExtension (PlCoreBase){
required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the GUI Extensions", null = False, db_index = False];
required string files = 2 [max_length = 1024, content_type = "stripped", blank = False, help_text = "List of comma separated file composing the view", null = False, db_index = False];
}
diff --git a/xos/genx/xprotos/core/xosvolume.xproto b/xos/genx/xprotos/core/xosvolume.xproto
index 1449549..2da83d3 100644
--- a/xos/genx/xprotos/core/xosvolume.xproto
+++ b/xos/genx/xprotos/core/xosvolume.xproto
@@ -1,6 +1,6 @@
-message XOSVolume {
+message XOSVolume (PlCoreBase){
required manytoone xos->XOS:volumes = 1 [help_text = "The XOS object for this Volume", null = False, db_index = True, blank = False];
required string container_path = 2 [max_length = 1024, content_type = "stripped", blank = False, help_text = "Path of Volume in Container", null = False, db_index = False];
required string host_path = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "Path of Volume in Host", null = False, db_index = False];