from PLC.Nodes import Nodes, Node
from PLC.NodeTags import NodeTags, NodeTag
from PLC.Interfaces import Interfaces, Interface
-from PLC.InterfaceSettings import InterfaceSettings, InterfaceSetting
+from PLC.InterfaceTags import InterfaceTags, InterfaceTag
from PLC.Slices import Slices, Slice
-from PLC.SliceAttributes import SliceAttributes, SliceAttribute
+from PLC.SliceTags import SliceTags, SliceTag
# this is another story..
#from PLC.Ilinks import Ilink
'joins_class' : NodeTags, 'join_class' : NodeTag,
'value_key': 'tagvalue', 'secondary_key': 'hostname'},
Interface : {'table_class' : Interfaces,
- 'joins_class': InterfaceSettings, 'join_class': InterfaceSetting,
+ 'joins_class': InterfaceTags, 'join_class': InterfaceTag,
'value_key' : 'value' },
Slice: {'table_class' : Slices,
- 'joins_class': SliceAttributes, 'join_class': SliceAttribute,
+ 'joins_class': SliceTags, 'join_class': SliceTag,
'value_key' : 'value', 'secondary_key':'login_base'},
# Ilink : xxx
}
tag_type.sync()
tag_type_id = tag_type['tag_type_id']
- # locate the join object (e.g. NodeTag, SliceAttribute or InterfaceSetting)
+ # locate the join object (e.g. NodeTag, SliceTag or InterfaceTag)
filter = {'tag_type_id':tag_type_id}
if isinstance (id_or_name,int):
filter[primary_key]=id_or_name
+++ /dev/null
-# $Id#
-#
-# Thierry Parmentelat - INRIA
-#
-# $Revision$
-#
-from PLC.Faults import *
-from PLC.Parameter import Parameter
-from PLC.Filter import Filter
-from PLC.Table import Row, Table
-from PLC.TagTypes import TagType, TagTypes
-
-class InterfaceSetting(Row):
- """
- Representation of a row in the interface_setting.
- To use, instantiate with a dict of values.
- """
-
- table_name = 'interface_setting'
- primary_key = 'interface_setting_id'
- fields = {
- 'interface_setting_id': Parameter(int, "Interface setting identifier"),
- 'interface_id': Parameter(int, "Interface identifier"),
- 'tag_type_id': TagType.fields['tag_type_id'],
- 'tagname': TagType.fields['tagname'],
- 'description': TagType.fields['description'],
- 'category': TagType.fields['category'],
- 'min_role_id': TagType.fields['min_role_id'],
- 'value': Parameter(str, "Interface setting value"),
- ### relations
-
- }
-
-class InterfaceSettings(Table):
- """
- Representation of row(s) from the interface_setting table in the
- database.
- """
-
- def __init__(self, api, interface_setting_filter = None, columns = None):
- Table.__init__(self, api, InterfaceSetting, columns)
-
- sql = "SELECT %s FROM view_interface_settings WHERE True" % \
- ", ".join(self.columns)
-
- if interface_setting_filter is not None:
- if isinstance(interface_setting_filter, (list, tuple, set)):
- interface_setting_filter = Filter(InterfaceSetting.fields, {'interface_setting_id': interface_setting_filter})
- elif isinstance(interface_setting_filter, dict):
- interface_setting_filter = Filter(InterfaceSetting.fields, interface_setting_filter)
- elif isinstance(interface_setting_filter, int):
- interface_setting_filter = Filter(InterfaceSetting.fields, {'interface_setting_id': [interface_setting_filter]})
- else:
- raise PLCInvalidArgument, "Wrong interface setting filter %r"%interface_setting_filter
- sql += " AND (%s) %s" % interface_setting_filter.sql(api)
-
-
- self.selectall(sql)
--- /dev/null
+# $Id#
+#
+# Thierry Parmentelat - INRIA
+#
+# $Revision$
+#
+from PLC.Faults import *
+from PLC.Parameter import Parameter
+from PLC.Filter import Filter
+from PLC.Table import Row, Table
+from PLC.TagTypes import TagType, TagTypes
+
+class InterfaceTag(Row):
+ """
+ Representation of a row in the interface_tag.
+ To use, instantiate with a dict of values.
+ """
+
+ table_name = 'interface_tag'
+ primary_key = 'interface_tag_id'
+ fields = {
+ 'interface_tag_id': Parameter(int, "Interface setting identifier"),
+ 'interface_id': Parameter(int, "Interface identifier"),
+ 'tag_type_id': TagType.fields['tag_type_id'],
+ 'tagname': TagType.fields['tagname'],
+ 'description': TagType.fields['description'],
+ 'category': TagType.fields['category'],
+ 'min_role_id': TagType.fields['min_role_id'],
+ 'value': Parameter(str, "Interface setting value"),
+ ### relations
+
+ }
+
+class InterfaceTags(Table):
+ """
+ Representation of row(s) from the interface_tag table in the
+ database.
+ """
+
+ def __init__(self, api, interface_tag_filter = None, columns = None):
+ Table.__init__(self, api, InterfaceTag, columns)
+
+ sql = "SELECT %s FROM view_interface_tags WHERE True" % \
+ ", ".join(self.columns)
+
+ if interface_tag_filter is not None:
+ if isinstance(interface_tag_filter, (list, tuple, set)):
+ interface_tag_filter = Filter(InterfaceTag.fields, {'interface_tag_id': interface_tag_filter})
+ elif isinstance(interface_tag_filter, dict):
+ interface_tag_filter = Filter(InterfaceTag.fields, interface_tag_filter)
+ elif isinstance(interface_tag_filter, int):
+ interface_tag_filter = Filter(InterfaceTag.fields, {'interface_tag_id': [interface_tag_filter]})
+ else:
+ raise PLCInvalidArgument, "Wrong interface setting filter %r"%interface_tag_filter
+ sql += " AND (%s) %s" % interface_tag_filter.sql(api)
+
+
+ self.selectall(sql)
table_name = 'interfaces'
primary_key = 'interface_id'
- join_tables = ['interface_setting']
+ join_tables = ['interface_tag']
fields = {
'interface_id': Parameter(int, "Node interface identifier"),
'method': Parameter(str, "Addressing method (e.g., 'static' or 'dhcp')"),
'hostname': Parameter(str, "(Optional) Hostname", nullok = True),
'node_id': Parameter(int, "Node associated with this interface"),
'is_primary': Parameter(bool, "Is the primary interface for this node"),
- 'interface_setting_ids' : Parameter([int], "List of interface settings"),
+ 'interface_tag_ids' : Parameter([int], "List of interface settings"),
}
def validate_method(self, method):
def legacy_method (legacyname):
# new method name
- newname=legacyname.replace("NodeNetwork","Interface")
+ newname=legacyname.replace("NodeNetwork","Interface").replace("Setting","Tag")
# locate new class
newclass=getattr(import_deep("PLC.Methods."+newname),newname)
# create class for legacy name
from PLC.Auth import Auth
from PLC.TagTypes import TagType, TagTypes
-from PLC.InterfaceSettings import InterfaceSetting, InterfaceSettings
+from PLC.InterfaceTags import InterfaceTag, InterfaceTags
from PLC.Interfaces import Interface, Interfaces
from PLC.Nodes import Nodes
from PLC.Sites import Sites
-class AddInterfaceSetting(Method):
+class AddInterfaceTag(Method):
"""
Sets the specified setting for the specified interface
to the specified value.
In general only tech(s), PI(s) and of course admin(s) are allowed to
do the change, but this is defined in the tag type object.
- Returns the new interface_setting_id (> 0) if successful, faults
+ Returns the new interface_tag_id (> 0) if successful, faults
otherwise.
"""
accepts = [
Auth(),
# no other way to refer to a interface
- InterfaceSetting.fields['interface_id'],
+ InterfaceTag.fields['interface_id'],
Mixed(TagType.fields['tag_type_id'],
TagType.fields['tagname']),
- InterfaceSetting.fields['value'],
+ InterfaceTag.fields['value'],
]
- returns = Parameter(int, 'New interface_setting_id (> 0) if successful')
+ returns = Parameter(int, 'New interface_tag_id (> 0) if successful')
object_type = 'Interface'
tag_type = tag_types[0]
# checks for existence - does not allow several different settings
- conflicts = InterfaceSettings(self.api,
+ conflicts = InterfaceTags(self.api,
{'interface_id':interface['interface_id'],
'tag_type_id':tag_type['tag_type_id']})
min(self.caller['role_ids']) > required_min_role:
raise PLCPermissionDenied, "Not allowed to modify the specified interface setting, requires role %d",required_min_role
- interface_setting = InterfaceSetting(self.api)
- interface_setting['interface_id'] = interface['interface_id']
- interface_setting['tag_type_id'] = tag_type['tag_type_id']
- interface_setting['value'] = value
+ interface_tag = InterfaceTag(self.api)
+ interface_tag['interface_id'] = interface['interface_id']
+ interface_tag['tag_type_id'] = tag_type['tag_type_id']
+ interface_tag['value'] = value
- interface_setting.sync()
- self.object_ids = [interface_setting['interface_setting_id']]
+ interface_tag.sync()
+ self.object_ids = [interface_tag['interface_tag_id']]
- return interface_setting['interface_setting_id']
+ return interface_tag['interface_tag_id']
from PLC.TagTypes import TagType, TagTypes
from PLC.Slices import Slice, Slices
from PLC.Nodes import Node, Nodes
-from PLC.SliceAttributes import SliceAttribute, SliceAttributes
+from PLC.SliceTags import SliceTag, SliceTags
from PLC.NodeGroups import NodeGroup, NodeGroups
from PLC.InitScripts import InitScript, InitScripts
from PLC.Auth import Auth
-class AddSliceAttribute(Method):
+class AddSliceTag(Method):
"""
Sets the specified attribute of the slice (or sliver, if
node_id_or_hostname is specified) to the specified value.
attributes of slices or slivers at their sites, or of which they
are members. Admins may set attributes of any slice or sliver.
- Returns the new slice_attribute_id (> 0) if successful, faults
+ Returns the new slice_tag_id (> 0) if successful, faults
otherwise.
"""
Auth(),
Mixed(Slice.fields['slice_id'],
Slice.fields['name']),
- Mixed(SliceAttribute.fields['tag_type_id'],
- SliceAttribute.fields['tagname']),
- Mixed(SliceAttribute.fields['value'],
+ Mixed(SliceTag.fields['tag_type_id'],
+ SliceTag.fields['tagname']),
+ Mixed(SliceTag.fields['value'],
InitScript.fields['name']),
Mixed(Node.fields['node_id'],
Node.fields['hostname'],
NodeGroup.fields['groupname'])
]
- returns = Parameter(int, 'New slice_attribute_id (> 0) if successful')
+ returns = Parameter(int, 'New slice_tag_id (> 0) if successful')
def call(self, auth, slice_id_or_name, tag_type_id_or_name, value, node_id_or_hostname = None, nodegroup_id_or_name = None):
slices = Slices(self.api, [slice_id_or_name])
if not initscripts:
raise PLCInvalidArgument, "No such plc initscript %r"%value
- slice_attribute = SliceAttribute(self.api)
- slice_attribute['slice_id'] = slice['slice_id']
- slice_attribute['tag_type_id'] = tag_type['tag_type_id']
- slice_attribute['value'] = unicode(value)
+ slice_tag = SliceTag(self.api)
+ slice_tag['slice_id'] = slice['slice_id']
+ slice_tag['tag_type_id'] = tag_type['tag_type_id']
+ slice_tag['value'] = unicode(value)
# Sliver attribute if node is specified
if node_id_or_hostname is not None:
if node['node_id'] not in slice['node_ids']:
raise PLCInvalidArgument, "Node not in the specified slice"
- slice_attribute['node_id'] = node['node_id']
+ slice_tag['node_id'] = node['node_id']
# Sliver attribute shared accross nodes if nodegroup is sepcified
if nodegroup_id_or_name is not None:
raise PLCInvalidArgument, "No such nodegroup %r"%nodegroup_id_or_name
nodegroup = nodegroups[0]
- slice_attribute['nodegroup_id'] = nodegroup['nodegroup_id']
+ slice_tag['nodegroup_id'] = nodegroup['nodegroup_id']
# Check if slice attribute alreay exists
- slice_attributes_check = SliceAttributes(self.api, {'slice_id': slice['slice_id'],
+ slice_tags_check = SliceTags(self.api, {'slice_id': slice['slice_id'],
'tagname': tag_type['tagname'],
'value': value})
- for slice_attribute_check in slice_attributes_check:
- if 'node_id' in slice_attribute and slice_attribute['node_id'] == slice_attribute_check['node_id']:
+ for slice_tag_check in slice_tags_check:
+ if 'node_id' in slice_tag and slice_tag['node_id'] == slice_tag_check['node_id']:
raise PLCInvalidArgument, "Sliver attribute already exists"
- if 'nodegroup_id' in slice_attribute and slice_attribute['nodegroup_id'] == slice_attribute_check['nodegroup_id']:
+ if 'nodegroup_id' in slice_tag and slice_tag['nodegroup_id'] == slice_tag_check['nodegroup_id']:
raise PLCInvalidArgument, "Slice attribute already exists for this nodegroup"
if node_id_or_hostname is None and nodegroup_id_or_name is None:
raise PLCInvalidArgument, "Slice attribute already exists"
- slice_attribute.sync()
- self.event_objects = {'SliceAttribute': [slice_attribute['slice_attribute_id']]}
+ slice_tag.sync()
+ self.event_objects = {'SliceTag': [slice_tag['slice_tag_id']]}
- return slice_attribute['slice_attribute_id']
+ return slice_tag['slice_tag_id']
from PLC.Parameter import Parameter, Mixed
from PLC.Auth import Auth
-from PLC.InterfaceSettings import InterfaceSetting, InterfaceSettings
+from PLC.InterfaceTags import InterfaceTag, InterfaceTags
from PLC.Interfaces import Interface, Interfaces
from PLC.Nodes import Node, Nodes
from PLC.Sites import Site, Sites
-class DeleteInterfaceSetting(Method):
+class DeleteInterfaceTag(Method):
"""
Deletes the specified interface setting
accepts = [
Auth(),
- InterfaceSetting.fields['interface_setting_id']
+ InterfaceTag.fields['interface_tag_id']
]
returns = Parameter(int, '1 if successful')
object_type = 'Interface'
- def call(self, auth, interface_setting_id):
- interface_settings = InterfaceSettings(self.api, [interface_setting_id])
- if not interface_settings:
- raise PLCInvalidArgument, "No such interface setting %r"%interface_setting_id
- interface_setting = interface_settings[0]
+ def call(self, auth, interface_tag_id):
+ interface_tags = InterfaceTags(self.api, [interface_tag_id])
+ if not interface_tags:
+ raise PLCInvalidArgument, "No such interface tag %r"%interface_tag_id
+ interface_tag = interface_tags[0]
- ### reproducing a check from UpdateSliceAttribute, looks dumb though
- interfaces = Interfaces(self.api, [interface_setting['interface_id']])
+ ### reproducing a check from UpdateSliceTag, looks dumb though
+ interfaces = Interfaces(self.api, [interface_tag['interface_id']])
if not interfaces:
- raise PLCInvalidArgument, "No such interface %r"%interface_setting['interface_id']
+ raise PLCInvalidArgument, "No such interface %r"%interface_tag['interface_id']
interface = interfaces[0]
- assert interface_setting['interface_setting_id'] in interface['interface_setting_ids']
+ assert interface_tag['interface_tag_id'] in interface['interface_tag_ids']
# check permission : it not admin, is the user affiliated with the right site
if 'admin' not in self.caller['roles']:
min(self.caller['role_ids']) > required_min_role:
raise PLCPermissionDenied, "Not allowed to modify the specified interface setting, requires role %d",required_min_role
- interface_setting.delete()
- self.object_ids = [interface_setting['interface_setting_id']]
+ interface_tag.delete()
+ self.object_ids = [interface_tag['interface_tag_id']]
return 1
raise PLCInvalidArgument, "No such node tag %r"%node_tag_id
node_tag = node_tags[0]
- ### reproducing a check from UpdateSliceAttribute, looks dumb though
+ ### reproducing a check from UpdateSliceTag, looks dumb though
nodes = Nodes(self.api, [node_tag['node_id']])
if not nodes:
raise PLCInvalidArgument, "No such node %r"%node_tag['node_id']
-# $Id#
+g# $Id#
from PLC.Faults import *
from PLC.Method import Method
from PLC.Parameter import Parameter, Mixed
-from PLC.SliceAttributes import SliceAttribute, SliceAttributes
+from PLC.SliceTags import SliceTag, SliceTags
from PLC.Slices import Slice, Slices
from PLC.Nodes import Node, Nodes
from PLC.Auth import Auth
-class DeleteSliceAttribute(Method):
+class DeleteSliceTag(Method):
"""
Deletes the specified slice or sliver attribute.
accepts = [
Auth(),
- SliceAttribute.fields['slice_attribute_id']
+ SliceTag.fields['slice_tag_id']
]
returns = Parameter(int, '1 if successful')
- def call(self, auth, slice_attribute_id):
- slice_attributes = SliceAttributes(self.api, [slice_attribute_id])
- if not slice_attributes:
+ def call(self, auth, slice_tag_id):
+ slice_tags = SliceTags(self.api, [slice_tag_id])
+ if not slice_tags:
raise PLCInvalidArgument, "No such slice attribute"
- slice_attribute = slice_attributes[0]
+ slice_tag = slice_tags[0]
- slices = Slices(self.api, [slice_attribute['slice_id']])
+ slices = Slices(self.api, [slice_tag['slice_id']])
if not slices:
raise PLCInvalidArgument, "No such slice"
slice = slices[0]
- assert slice_attribute['slice_attribute_id'] in slice['slice_attribute_ids']
+ assert slice_tag['slice_tag_id'] in slice['slice_tag_ids']
if 'admin' not in self.caller['roles']:
if self.caller['person_id'] in slice['person_ids']:
elif slice['site_id'] not in self.caller['site_ids']:
raise PLCPermissionDenied, "Specified slice not associated with any of your sites"
- if slice_attribute['min_role_id'] is not None and \
- min(self.caller['role_ids']) > slice_attribute['min_role_id']:
+ if slice_tag['min_role_id'] is not None and \
+ min(self.caller['role_ids']) > slice_tag['min_role_id']:
raise PLCPermissioinDenied, "Not allowed to delete the specified attribute"
- slice_attribute.delete()
- self.event_objects = {'SliceAttribute': [slice_attribute['slice_attribute_id']]}
+ slice_tag.delete()
+ self.event_objects = {'SliceTag': [slice_tag['slice_tag_id']]}
return 1
from PLC.Nodes import Node, Nodes
from PLC.Interfaces import Interface, Interfaces
-from PLC.InterfaceSettings import InterfaceSetting, InterfaceSettings
+from PLC.InterfaceTags import InterfaceTag, InterfaceTags
from PLC.NodeTags import NodeTags
# could not define this in the class..
file += 'DOMAIN_NAME="%s"\n' % domain
# define various interface settings attached to the primary interface
- settings = InterfaceSettings (self.api, {'interface_id':interface['interface_id']})
+ settings = InterfaceTags (self.api, {'interface_id':interface['interface_id']})
categories = set()
for setting in settings:
categories.add(setting['category'])
for category in categories:
- category_settings = InterfaceSettings(self.api,{'interface_id':interface['interface_id'],
+ category_settings = InterfaceTags(self.api,{'interface_id':interface['interface_id'],
'category':category})
if category_settings:
file += '### Category : %s\n'%category
from PLC.Filter import Filter
from PLC.Auth import Auth
-from PLC.InterfaceSettings import InterfaceSetting, InterfaceSettings
+from PLC.InterfaceTags import InterfaceTag, InterfaceTags
from PLC.Sites import Site, Sites
from PLC.Interfaces import Interface, Interfaces
-class GetInterfaceSettings(Method):
+class GetInterfaceTags(Method):
"""
Returns an array of structs containing details about
interfaces and related settings.
- If interface_setting_filter is specified and is an array of
+ If interface_tag_filter is specified and is an array of
interface setting identifiers, only interface settings matching
the filter will be returned. If return_fields is specified, only
the specified details will be returned.
accepts = [
Auth(),
- Mixed([InterfaceSetting.fields['interface_setting_id']],
+ Mixed([InterfaceTag.fields['interface_tag_id']],
Parameter(int,"Interface setting id"),
- Filter(InterfaceSetting.fields)),
+ Filter(InterfaceTag.fields)),
Parameter([str], "List of fields to return", nullok = True)
]
- returns = [InterfaceSetting.fields]
+ returns = [InterfaceTag.fields]
- def call(self, auth, interface_setting_filter = None, return_fields = None):
+ def call(self, auth, interface_tag_filter = None, return_fields = None):
- interface_settings = InterfaceSettings(self.api, interface_setting_filter, return_fields)
+ interface_tags = InterfaceTags(self.api, interface_tag_filter, return_fields)
- return interface_settings
+ return interface_tags
from PLC.Nodes import Node, Nodes
from PLC.Persons import Person, Persons
from PLC.Slices import Slice, Slices
-from PLC.SliceAttributes import SliceAttributes
+from PLC.SliceTags import SliceTags
class GetPeerData(Method):
"""
'peer_id': None}, person_fields)
# filter out system slices
- system_slice_ids = SliceAttributes(self.api, {'name': 'system', 'value': '1'}).dict('slice_id')
+ system_slice_ids = SliceTags(self.api, {'name': 'system', 'value': '1'}).dict('slice_id')
slices = Slices(self.api, {'peer_id': None,
'~slice_id':system_slice_ids.keys()})
from PLC.Method import Method
from PLC.Parameter import Parameter, Mixed
from PLC.Filter import Filter
-from PLC.SliceAttributes import SliceAttribute, SliceAttributes
+from PLC.SliceTags import SliceTag, SliceTags
from PLC.Persons import Person, Persons
from PLC.Sites import Site, Sites
from PLC.Slices import Slice, Slices
from PLC.Auth import Auth
-class GetSliceAttributes(Method):
+class GetSliceTags(Method):
"""
Returns an array of structs containing details about slice and
sliver attributes. An attribute is a sliver attribute if the
- node_id field is set. If slice_attribute_filter is specified and
+ node_id field is set. If slice_tag_filter is specified and
is an array of slice attribute identifiers, or a struct of slice
attribute attributes, only slice attributes matching the filter
will be returned. If return_fields is specified, only the
accepts = [
Auth(),
- Mixed([SliceAttribute.fields['slice_attribute_id']],
- Filter(SliceAttribute.fields)),
+ Mixed([SliceTag.fields['slice_tag_id']],
+ Filter(SliceTag.fields)),
Parameter([str], "List of fields to return", nullok = True)
]
- returns = [SliceAttribute.fields]
+ returns = [SliceTag.fields]
- def call(self, auth, slice_attribute_filter = None, return_fields = None):
+ def call(self, auth, slice_tag_filter = None, return_fields = None):
# If we are not admin, make sure to only return our own slice
# and sliver attributes.
if isinstance(self.caller, Person) and \
return []
# Get slice attributes that we are able to view
- valid_slice_attribute_ids = []
+ valid_slice_tag_ids = []
slices = Slices(self.api, valid_slice_ids)
for slice in slices:
- valid_slice_attribute_ids += slice['slice_attribute_ids']
+ valid_slice_tag_ids += slice['slice_tag_ids']
- if not valid_slice_attribute_ids:
+ if not valid_slice_tag_ids:
return []
- if slice_attribute_filter is None:
- slice_attribute_filter = valid_slice_attribute_ids
+ if slice_tag_filter is None:
+ slice_tag_filter = valid_slice_tag_ids
- # Must query at least slice_attribute_id (see below)
- if return_fields is not None and 'slice_attribute_id' not in return_fields:
- return_fields.append('slice_attribute_id')
+ # Must query at least slice_tag_id (see below)
+ if return_fields is not None and 'slice_tag_id' not in return_fields:
+ return_fields.append('slice_tag_id')
added_fields = True
else:
added_fields = False
- slice_attributes = SliceAttributes(self.api, slice_attribute_filter, return_fields)
+ slice_tags = SliceTags(self.api, slice_tag_filter, return_fields)
# Filter out slice attributes that are not viewable
if isinstance(self.caller, Person) and \
'admin' not in self.caller['roles']:
- slice_attributes = filter(lambda slice_attribute: \
- slice_attribute['slice_attribute_id'] in valid_slice_attribute_ids,
- slice_attributes)
+ slice_tags = filter(lambda slice_tag: \
+ slice_tag['slice_tag_id'] in valid_slice_tag_ids,
+ slice_tags)
- # Remove slice_attribute_id if not specified
+ # Remove slice_tag_id if not specified
if added_fields:
- for slice_attribute in slice_attributes:
- if 'slice_attribute_id' in slice_attribute:
- del slice_attribute['slice_attribute_id']
+ for slice_tag in slice_tags:
+ if 'slice_tag_id' in slice_tag:
+ del slice_tag['slice_tag_id']
- return slice_attributes
+ return slice_tags
from PLC.Slices import Slice, Slices
from PLC.Persons import Person, Persons
from PLC.Keys import Key, Keys
-from PLC.SliceAttributes import SliceAttribute, SliceAttributes
+from PLC.SliceTags import SliceTag, SliceTags
from PLC.InitScripts import InitScript, InitScripts
def get_slivers(api, slice_filter, node = None):
# Get slice information
- slices = Slices(api, slice_filter, ['slice_id', 'name', 'instantiation', 'expires', 'person_ids', 'slice_attribute_ids'])
+ slices = Slices(api, slice_filter, ['slice_id', 'name', 'instantiation', 'expires', 'person_ids', 'slice_tag_ids'])
# Build up list of users and slice attributes
person_ids = set()
- slice_attribute_ids = set()
+ slice_tag_ids = set()
for slice in slices:
person_ids.update(slice['person_ids'])
- slice_attribute_ids.update(slice['slice_attribute_ids'])
+ slice_tag_ids.update(slice['slice_tag_ids'])
# Get user information
all_persons = Persons(api, {'person_id':person_ids,'enabled':True}, ['person_id', 'enabled', 'key_ids']).dict()
all_keys = Keys(api, key_ids, ['key_id', 'key', 'key_type']).dict()
# Get slice attributes
- all_slice_attributes = SliceAttributes(api, slice_attribute_ids).dict()
+ all_slice_tags = SliceTags(api, slice_tag_ids).dict()
slivers = []
for slice in slices:
attributes = []
# All (per-node and global) attributes for this slice
- slice_attributes = []
- for slice_attribute_id in slice['slice_attribute_ids']:
- if slice_attribute_id in all_slice_attributes:
- slice_attributes.append(all_slice_attributes[slice_attribute_id])
+ slice_tags = []
+ for slice_tag_id in slice['slice_tag_ids']:
+ if slice_tag_id in all_slice_tags:
+ slice_tags.append(all_slice_tags[slice_tag_id])
# Per-node sliver attributes take precedence over global
# slice attributes, so set them first.
sliver_attributes = []
if node is not None:
- for sliver_attribute in filter(lambda a: a['node_id'] == node['node_id'], slice_attributes):
+ for sliver_attribute in filter(lambda a: a['node_id'] == node['node_id'], slice_tags):
sliver_attributes.append(sliver_attribute['tagname'])
attributes.append({'tagname': sliver_attribute['tagname'],
'value': sliver_attribute['value']})
# set nodegroup slice attributes
- for slice_attribute in filter(lambda a: a['nodegroup_id'] in node['nodegroup_ids'], slice_attributes):
+ for slice_tag in filter(lambda a: a['nodegroup_id'] in node['nodegroup_ids'], slice_tags):
# Do not set any nodegroup slice attributes for
# which there is at least one sliver attribute
# already set.
- if slice_attribute['tagname'] not in slice_attributes:
- attributes.append({'tagname': slice_attribute['tagname'],
- 'value': slice_attribute['value']})
+ if slice_tag['tagname'] not in slice_tags:
+ attributes.append({'tagname': slice_tag['tagname'],
+ 'value': slice_tag['value']})
- for slice_attribute in filter(lambda a: a['node_id'] is None, slice_attributes):
+ for slice_tag in filter(lambda a: a['node_id'] is None, slice_tags):
# Do not set any global slice attributes for
# which there is at least one sliver attribute
# already set.
- if slice_attribute['tagname'] not in sliver_attributes:
- attributes.append({'tagname': slice_attribute['tagname'],
- 'value': slice_attribute['value']})
+ if slice_tag['tagname'] not in sliver_attributes:
+ attributes.append({'tagname': slice_tag['tagname'],
+ 'value': slice_tag['value']})
slivers.append({
'name': slice['name'],
'key': Key.fields['key']
}],
'attributes': [{
- 'tagname': SliceAttribute.fields['tagname'],
- 'value': SliceAttribute.fields['value']
+ 'tagname': SliceTag.fields['tagname'],
+ 'value': SliceTag.fields['value']
}]
}]
}
initscripts = InitScripts(self.api, {'enabled': True})
# Get system slices
- system_slice_attributes = SliceAttributes(self.api, {'tagname': 'system', 'value': '1'}).dict('slice_id')
- system_slice_ids = system_slice_attributes.keys()
+ system_slice_tags = SliceTags(self.api, {'tagname': 'system', 'value': '1'}).dict('slice_id')
+ system_slice_ids = system_slice_tags.keys()
# Get nm-controller slices
controller_and_delegated_slices = Slices(self.api, {'instantiation': ['nm-controller', 'delegated']}, ['slice_id']).dict('slice_id')
from PLC.Filter import Filter
from PLC.Auth import Auth
from PLC.Slices import Slice, Slices
-from PLC.SliceAttributes import SliceAttribute, SliceAttributes
+from PLC.SliceTags import SliceTag, SliceTags
from PLC.Sites import Site, Sites
from PLC.Nodes import Node, Nodes
from PLC.Persons import Person, Persons
index = slices.index(slice)
node_ids = slices[index].pop('node_ids')
person_ids = slices[index].pop('person_ids')
- attribute_ids = slices[index].pop('slice_attribute_ids')
+ attribute_ids = slices[index].pop('slice_tag_ids')
if return_users or return_users is None:
persons = Persons(self.api, person_ids)
person_info = [{'email': person['email'],
for node in nodes]
slices[index]['nodes'] = node_info
if return_attributes or return_attributes is None:
- attributes = SliceAttributes(self.api, attribute_ids)
+ attributes = SliceTags(self.api, attribute_ids)
attribute_info = [{'name': attribute['name'],
'value': attribute['value']} \
for attribute in attributes]
from PLC.Slices import Slice, Slices
from PLC.Nodes import Node, Nodes
from PLC.Persons import Person, Persons
-from PLC.SliceAttributes import SliceAttribute, SliceAttributes
+from PLC.SliceTags import SliceTag, SliceTags
from PLC.Methods.GetSliceTicket import GetSliceTicket
nodes = Nodes(self.api, slice['node_ids']).dict()
persons = Persons(self.api, slice['person_ids']).dict()
- slice_attributes = SliceAttributes(self.api, slice['slice_attribute_ids']).dict()
+ slice_tags = SliceTags(self.api, slice['slice_tag_ids']).dict()
ticket = NamedTemporaryFile()
# <rspec>
xml.startElement('rspec', {})
- for slice_attribute_id in slice['slice_attribute_ids']:
- if not slice_attributes.has_key(slice_attribute_id):
+ for slice_tag_id in slice['slice_tag_ids']:
+ if not slice_tags.has_key(slice_tag_id):
continue
- slice_attribute = slice_attributes[slice_attribute_id]
+ slice_tag = slice_tags[slice_tag_id]
- name = slice_attribute['name']
- value = slice_attribute['value']
+ name = slice_tag['name']
+ value = slice_tag['value']
def kbps_to_bps(kbps):
bps = int(kbps) * 1000
if name == 'initscript':
(attribute_name, value_name, type) = ('initscript', 'initscript_id', 'integer')
- value = slice_attribute['slice_attribute_id']
+ value = slice_tag['slice_tag_id']
elif name in name_type_cast:
(attribute_name, value_name, type, cast) = name_type_cast[name]
value = cast(value)
from PLC.Parameter import Parameter, Mixed
from PLC.Auth import Auth
-from PLC.InterfaceSettings import InterfaceSetting, InterfaceSettings
+from PLC.InterfaceTags import InterfaceTag, InterfaceTags
from PLC.Interfaces import Interface, Interfaces
from PLC.Nodes import Nodes
from PLC.Sites import Sites
-class UpdateInterfaceSetting(Method):
+class UpdateInterfaceTag(Method):
"""
Updates the value of an existing interface setting
accepts = [
Auth(),
- InterfaceSetting.fields['interface_setting_id'],
- InterfaceSetting.fields['value']
+ InterfaceTag.fields['interface_tag_id'],
+ InterfaceTag.fields['value']
]
returns = Parameter(int, '1 if successful')
object_type = 'Interface'
- def call(self, auth, interface_setting_id, value):
- interface_settings = InterfaceSettings(self.api, [interface_setting_id])
- if not interface_settings:
- raise PLCInvalidArgument, "No such interface setting %r"%interface_setting_id
- interface_setting = interface_settings[0]
+ def call(self, auth, interface_tag_id, value):
+ interface_tags = InterfaceTags(self.api, [interface_tag_id])
+ if not interface_tags:
+ raise PLCInvalidArgument, "No such interface setting %r"%interface_tag_id
+ interface_tag = interface_tags[0]
- ### reproducing a check from UpdateSliceAttribute, looks dumb though
- interfaces = Interfaces(self.api, [interface_setting['interface_id']])
+ ### reproducing a check from UpdateSliceTag, looks dumb though
+ interfaces = Interfaces(self.api, [interface_tag['interface_id']])
if not interfaces:
- raise PLCInvalidArgument, "No such interface %r"%interface_setting['interface_id']
+ raise PLCInvalidArgument, "No such interface %r"%interface_tag['interface_id']
interface = interfaces[0]
- assert interface_setting['interface_setting_id'] in interface['interface_setting_ids']
+ assert interface_tag['interface_tag_id'] in interface['interface_tag_ids']
# check permission : it not admin, is the user affiliated with the right site
if 'admin' not in self.caller['roles']:
min(self.caller['role_ids']) > required_min_role:
raise PLCPermissionDenied, "Not allowed to modify the specified interface setting, requires role %d",required_min_role
- interface_setting['value'] = value
- interface_setting.sync()
+ interface_tag['value'] = value
+ interface_tag.sync()
- self.object_ids = [interface_setting['interface_setting_id']]
+ self.object_ids = [interface_tag['interface_tag_id']]
return 1
raise PLCInvalidArgument, "No such node tag %r"%node_tag_id
node_tag = node_tags[0]
- ### reproducing a check from UpdateSliceAttribute, looks dumb though
+ ### reproducing a check from UpdateSliceTag, looks dumb though
nodes = Nodes(self.api, [node_tag['node_id']])
if not nodes:
raise PLCInvalidArgument, "No such node %r"%node_tag['node_id']
from PLC.Faults import *
from PLC.Method import Method
from PLC.Parameter import Parameter, Mixed
-from PLC.SliceAttributes import SliceAttribute, SliceAttributes
+from PLC.SliceTags import SliceTag, SliceTags
from PLC.Slices import Slice, Slices
from PLC.InitScripts import InitScript, InitScripts
from PLC.Auth import Auth
-class UpdateSliceAttribute(Method):
+class UpdateSliceTag(Method):
"""
Updates the value of an existing slice or sliver attribute.
accepts = [
Auth(),
- SliceAttribute.fields['slice_attribute_id'],
- Mixed(SliceAttribute.fields['value'],
+ SliceTag.fields['slice_tag_id'],
+ Mixed(SliceTag.fields['value'],
InitScript.fields['name'])
]
returns = Parameter(int, '1 if successful')
- def call(self, auth, slice_attribute_id, value):
- slice_attributes = SliceAttributes(self.api, [slice_attribute_id])
- if not slice_attributes:
+ def call(self, auth, slice_tag_id, value):
+ slice_tags = SliceTags(self.api, [slice_tag_id])
+ if not slice_tags:
raise PLCInvalidArgument, "No such slice attribute"
- slice_attribute = slice_attributes[0]
+ slice_tag = slice_tags[0]
- slices = Slices(self.api, [slice_attribute['slice_id']])
+ slices = Slices(self.api, [slice_tag['slice_id']])
if not slices:
raise PLCInvalidArgument, "No such slice"
slice = slices[0]
- assert slice_attribute['slice_attribute_id'] in slice['slice_attribute_ids']
+ assert slice_tag['slice_tag_id'] in slice['slice_tag_ids']
if 'admin' not in self.caller['roles']:
if self.caller['person_id'] in slice['person_ids']:
elif slice['site_id'] not in self.caller['site_ids']:
raise PLCPermissionDenied, "Specified slice not associated with any of your sites"
- if slice_attribute['min_role_id'] is not None and \
- min(self.caller['role_ids']) > slice_attribute['min_role_id']:
+ if slice_tag['min_role_id'] is not None and \
+ min(self.caller['role_ids']) > slice_tag['min_role_id']:
raise PLCPermissionDenied, "Not allowed to update the specified attribute"
- if slice_attribute['tagname'] in ['initscript']:
+ if slice_tag['tagname'] in ['initscript']:
initscripts = InitScripts(self.api, {'enabled': True, 'name': value})
if not initscripts:
raise PLCInvalidArgument, "No such plc initscript"
- slice_attribute['value'] = unicode(value)
- slice_attribute.sync()
- self.event_objects = {'SliceAttribute': [slice_attribute['slice_attribute_id']]}
+ slice_tag['value'] = unicode(value)
+ slice_tag.sync()
+ self.event_objects = {'SliceTag': [slice_tag['slice_tag_id']]}
return 1
AddIlink
AddInitScript
AddInterface
-AddInterfaceSetting
+AddInterfaceTag
AddKeyType
AddMessage
AddNetworkMethod
AddSite
AddSiteAddress
AddSlice
-AddSliceAttribute
AddSliceInstantiation
+AddSliceTag
AddSliceToNodes
AddSliceToNodesWhitelist
AddTagType
DeleteIlink
DeleteInitScript
DeleteInterface
-DeleteInterfaceSetting
+DeleteInterfaceTag
DeleteKey
DeleteKeyType
DeleteMessage
DeleteSession
DeleteSite
DeleteSlice
-DeleteSliceAttribute
DeleteSliceFromNodes
DeleteSliceFromNodesWhitelist
DeleteSliceInstantiation
+DeleteSliceTag
DeleteTagType
GenerateNodeConfFile
GetAddressTypes
GetEvents
GetIlinks
GetInitScripts
-GetInterfaceSettings
+GetInterfaceTags
GetInterfaces
GetKeyTypes
GetKeys
GetSession
GetSessions
GetSites
-GetSliceAttributes
GetSliceInstantiations
GetSliceKeys
+GetSliceTags
GetSliceTicket
GetSlices
GetSlicesMD5
UpdateIlink
UpdateInitScript
UpdateInterface
-UpdateInterfaceSetting
+UpdateInterfaceTag
UpdateKey
UpdateMessage
UpdateNode
UpdatePerson
UpdateSite
UpdateSlice
-UpdateSliceAttribute
+UpdateSliceTag
UpdateTagType
VerifyPerson
system.listMethods
table_name = 'nodes'
primary_key = 'node_id'
- join_tables = [ 'slice_node', 'peer_node', 'slice_attribute',
+ join_tables = [ 'slice_node', 'peer_node', 'slice_tag',
'node_session', 'node_slice_whitelist',
'node_tag', 'conf_file_node', 'pcu_node', ]
fields = {
assert 'node_id' in self
assert 'interface_ids' in self
- # we need to clean up InterfaceSettings, so handling interfaces as part of join_tables does not work
+ # we need to clean up InterfaceTags, so handling interfaces as part of join_tables does not work
for interface in Interfaces(self.api,self['interface_ids']):
interface.delete()
from PLC.Keys import Key, Keys
from PLC.Nodes import Node, Nodes
from PLC.TagTypes import TagType, TagTypes
-from PLC.SliceAttributes import SliceAttribute, SliceAttributes
+from PLC.SliceTags import SliceTag, SliceTags
from PLC.Slices import Slice, Slices
class Peer(Row):
+++ /dev/null
-# $Id#
-from PLC.Faults import *
-from PLC.Parameter import Parameter
-from PLC.Filter import Filter
-from PLC.Table import Row, Table
-from PLC.TagTypes import TagType, TagTypes
-
-class SliceAttribute(Row):
- """
- Representation of a row in the slice_attribute table. To use,
- instantiate with a dict of values.
- """
-
- table_name = 'slice_attribute'
- primary_key = 'slice_attribute_id'
- fields = {
- 'slice_attribute_id': Parameter(int, "Slice attribute identifier"),
- 'slice_id': Parameter(int, "Slice identifier"),
- 'node_id': Parameter(int, "Node identifier, if a sliver attribute"),
- 'nodegroup_id': Parameter(int, "Nodegroup identifier, if a sliver attribute"),
- 'tag_type_id': TagType.fields['tag_type_id'],
- 'tagname': TagType.fields['tagname'],
- 'description': TagType.fields['description'],
- 'category': TagType.fields['category'],
- 'min_role_id': TagType.fields['min_role_id'],
- 'value': Parameter(str, "Slice attribute value"),
- }
-
-class SliceAttributes(Table):
- """
- Representation of row(s) from the slice_attribute table in the
- database.
- """
-
- def __init__(self, api, slice_attribute_filter = None, columns = None):
- Table.__init__(self, api, SliceAttribute, columns)
-
- sql = "SELECT %s FROM view_slice_attributes WHERE True" % \
- ", ".join(self.columns)
-
- if slice_attribute_filter is not None:
- if isinstance(slice_attribute_filter, (list, tuple, set)):
- slice_attribute_filter = Filter(SliceAttribute.fields, {'slice_attribute_id': slice_attribute_filter})
- elif isinstance(slice_attribute_filter, dict):
- slice_attribute_filter = Filter(SliceAttribute.fields, slice_attribute_filter)
- sql += " AND (%s) %s" % slice_attribute_filter.sql(api)
-
- self.selectall(sql)
--- /dev/null
+# $Id#
+from PLC.Faults import *
+from PLC.Parameter import Parameter
+from PLC.Filter import Filter
+from PLC.Table import Row, Table
+from PLC.TagTypes import TagType, TagTypes
+
+class SliceTag(Row):
+ """
+ Representation of a row in the slice_tag table. To use,
+ instantiate with a dict of values.
+ """
+
+ table_name = 'slice_tag'
+ primary_key = 'slice_tag_id'
+ fields = {
+ 'slice_tag_id': Parameter(int, "Slice attribute identifier"),
+ 'slice_id': Parameter(int, "Slice identifier"),
+ 'node_id': Parameter(int, "Node identifier, if a sliver attribute"),
+ 'nodegroup_id': Parameter(int, "Nodegroup identifier, if a sliver attribute"),
+ 'tag_type_id': TagType.fields['tag_type_id'],
+ 'tagname': TagType.fields['tagname'],
+ 'description': TagType.fields['description'],
+ 'category': TagType.fields['category'],
+ 'min_role_id': TagType.fields['min_role_id'],
+ 'value': Parameter(str, "Slice attribute value"),
+ }
+
+class SliceTags(Table):
+ """
+ Representation of row(s) from the slice_tag table in the
+ database.
+ """
+
+ def __init__(self, api, slice_tag_filter = None, columns = None):
+ Table.__init__(self, api, SliceTag, columns)
+
+ sql = "SELECT %s FROM view_slice_tags WHERE True" % \
+ ", ".join(self.columns)
+
+ if slice_tag_filter is not None:
+ if isinstance(slice_tag_filter, (list, tuple, set)):
+ slice_tag_filter = Filter(SliceTag.fields, {'slice_tag_id': slice_tag_filter})
+ elif isinstance(slice_tag_filter, dict):
+ slice_tag_filter = Filter(SliceTag.fields, slice_tag_filter)
+ sql += " AND (%s) %s" % slice_tag_filter.sql(api)
+
+ self.selectall(sql)
from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations
from PLC.Nodes import Node
from PLC.Persons import Person, Persons
-from PLC.SliceAttributes import SliceAttribute
+from PLC.SliceTags import SliceTag
class Slice(Row):
"""
table_name = 'slices'
primary_key = 'slice_id'
- join_tables = ['slice_node', 'slice_person', 'slice_attribute', 'peer_slice', 'node_slice_whitelist']
+ join_tables = ['slice_node', 'slice_person', 'slice_tag', 'peer_slice', 'node_slice_whitelist']
fields = {
'slice_id': Parameter(int, "Slice identifier"),
'site_id': Parameter(int, "Identifier of the site to which this slice belongs"),
'expires': Parameter(int, "Date and time when slice expires, in seconds since UNIX epoch"),
'node_ids': Parameter([int], "List of nodes in this slice", ro = True),
'person_ids': Parameter([int], "List of accounts that can use this slice", ro = True),
- 'slice_attribute_ids': Parameter([int], "List of slice attributes", ro = True),
+ 'slice_tag_ids': Parameter([int], "List of slice attributes", ro = True),
'peer_id': Parameter(int, "Peer to which this slice belongs", nullok = True),
'peer_slice_id': Parameter(int, "Foreign slice identifier at peer", nullok = True),
}
AddSliceToNodes.__call__(AddSliceToNodes(self.api), auth, self['slice_id'], list(new_nodes))
if stale_nodes:
DeleteSliceFromNodes.__call__(DeleteSliceFromNodes(self.api), auth, self['slice_id'], list(stale_nodes))
- def associate_slice_attributes(self, auth, fields, value):
+ def associate_slice_tags(self, auth, fields, value):
"""
- Deletes slice_attribute_ids not found in value list (using DeleteSliceAttribute).
- Adds slice_attributes if slice_fields w/o slice_id is found (using AddSliceAttribute).
- Updates slice_attribute if slice_fields w/ slice_id is found (using UpdateSlceiAttribute).
+ Deletes slice_tag_ids not found in value list (using DeleteSliceTag).
+ Adds slice_tags if slice_fields w/o slice_id is found (using AddSliceTag).
+ Updates slice_tag if slice_fields w/ slice_id is found (using UpdateSlceiAttribute).
"""
- assert 'slice_attribute_ids' in self
+ assert 'slice_tag_ids' in self
assert isinstance(value, list)
(attribute_ids, blank, attributes) = self.separate_types(value)
# There is no way to add attributes by id. They are
# associated with a slice when they are created.
# So we are only looking to delete here
- if self['slice_attribute_ids'] != attribute_ids:
- from PLC.Methods.DeleteSliceAttribute import DeleteSliceAttribute
- stale_attributes = set(self['slice_attribute_ids']).difference(attribute_ids)
+ if self['slice_tag_ids'] != attribute_ids:
+ from PLC.Methods.DeleteSliceTag import DeleteSliceTag
+ stale_attributes = set(self['slice_tag_ids']).difference(attribute_ids)
for stale_attribute in stale_attributes:
- DeleteSliceAttribute.__call__(DeleteSliceAttribute(self.api), auth, stale_attribute['slice_attribute_id'])
+ DeleteSliceTag.__call__(DeleteSliceTag(self.api), auth, stale_attribute['slice_tag_id'])
# If dictionary exists, we are either adding new
# attributes or updating existing ones.
if attributes:
- from PLC.Methods.AddSliceAttribute import AddSliceAttribute
- from PLC.Methods.UpdateSliceAttribute import UpdateSliceAttribute
+ from PLC.Methods.AddSliceTag import AddSliceTag
+ from PLC.Methods.UpdateSliceTag import UpdateSliceTag
- added_attributes = filter(lambda x: 'slice_attribute_id' not in x, attributes)
- updated_attributes = filter(lambda x: 'slice_attribute_id' in x, attributes)
+ added_attributes = filter(lambda x: 'slice_tag_id' not in x, attributes)
+ updated_attributes = filter(lambda x: 'slice_tag_id' in x, attributes)
for added_attribute in added_attributes:
if 'tag_type' in added_attribute:
else:
nodegroup_id = None
- AddSliceAttribute.__call__(AddSliceAttribute(self.api), auth, self['slice_id'], type, value, node_id, nodegroup_id)
+ AddSliceTag.__call__(AddSliceTag(self.api), auth, self['slice_id'], type, value, node_id, nodegroup_id)
for updated_attribute in updated_attributes:
- attribute_id = updated_attribute.pop('slice_attribute_id')
- if attribute_id not in self['slice_attribute_ids']:
+ attribute_id = updated_attribute.pop('slice_tag_id')
+ if attribute_id not in self['slice_tag_ids']:
raise PLCInvalidArgument, "Attribute doesnt belong to this slice"
else:
- UpdateSliceAttribute.__call__(UpdateSliceAttribute(self.api), auth, attribute_id, updated_attribute)
+ UpdateSliceTag.__call__(UpdateSliceTag(self.api), auth, attribute_id, updated_attribute)
def sync(self, commit = True):
"""
table_name = 'tag_types'
primary_key = 'tag_type_id'
- join_tables = ['node_tag', 'interface_setting', 'slice_attribute' ]
+ join_tables = ['node_tag', 'interface_tag', 'slice_tag' ]
fields = {
'tag_type_id': Parameter(int, "Node tag type identifier"),
'tagname': Parameter(str, "Node tag type name", max = 100),
GPG
Ilinks
InitScripts
-InterfaceSettings
+InterfaceTags
Interfaces
KeyTypes
Keys
Sessions
Shell
Sites
-SliceAttributes
SliceInstantiations
+SliceTags
Slices
Table
TagTypes
-s,nodenetwork,interface,g
s,slice_attribute_type,tag_type,g
s,attribute_type_id,tag_type_id,g
+s,nodenetwork_setting,interface_tag,g
+s,slice_attribute,slice_tag,g
+s,nodenetwork,interface,g
-- $Id$
--
-- this is part of the script to migrate from 4.2 to 5.0
+--
+-- most of the renamings have taken place already when this script is invoked
--
----------------------------------------
DROP VIEW node_slices_whitelist CASCADE;
DROP VIEW nodegroup_conf_files CASCADE;
DROP VIEW nodegroup_nodes CASCADE;
-DROP VIEW interface_settings CASCADE;
+DROP VIEW interface_tags CASCADE;
DROP VIEW pcu_nodes CASCADE;
DROP VIEW pcu_protocol_types CASCADE;
DROP VIEW peer_keys CASCADE;
DROP VIEW site_pcus CASCADE;
DROP VIEW site_persons CASCADE;
DROP VIEW site_slices CASCADE;
-DROP VIEW slice_attributes CASCADE;
+DROP VIEW slice_tags CASCADE;
DROP VIEW slice_nodes CASCADE;
DROP VIEW slice_persons CASCADE;
DROP VIEW slivers CASCADE;
-- caught by some previous cascade -- DROP VIEW view_events CASCADE;
DROP VIEW view_keys CASCADE;
-- caught by some previous cascade -- DROP VIEW view_nodegroups CASCADE;
-DROP VIEW view_interface_settings CASCADE;
+DROP VIEW view_interface_tags CASCADE;
-- caught by some previous cascade -- DROP VIEW view_interfaces CASCADE;
-- caught by some previous cascade -- DROP VIEW view_nodes CASCADE;
-- caught by some previous cascade -- DROP VIEW view_pcu_types CASCADE;
-- caught by some previous cascade -- DROP VIEW view_persons CASCADE;
DROP VIEW view_sessions CASCADE;
-- caught by some previous cascade -- DROP VIEW view_sites CASCADE;
-DROP VIEW view_slice_attributes CASCADE;
+DROP VIEW view_slice_tags CASCADE;
-- caught by some previous cascade -- DROP VIEW view_slices CASCADE;
-- shows in logfile
--- append in tag_types the contents of nodenetwork_setting_types
INSERT INTO tag_types (tagname,description,min_role_id,category)
- SELECT name,description,min_role_id,'interface/legacy' FROM interface_setting_types;
+ SELECT name,description,min_role_id,'interface/legacy' FROM interface_tag_types;
---------- interface settings
---- former nodenetwork_setting_type_id are now renumbered, need to fix interface_setting accordingly
+--- former nodenetwork_setting_type_id are now renumbered, need to fix interface_tag accordingly
-- old_index -> new_index relation
CREATE OR REPLACE VIEW mgn_setting_renumber AS
SELECT
- interface_setting_types.interface_setting_type_id AS old_index,
+ interface_tag_types.interface_tag_type_id AS old_index,
tag_types.tag_type_id AS new_index
FROM
- interface_setting_types INNER JOIN tag_types
- ON interface_setting_types.name = tag_types.tagname;
+ interface_tag_types INNER JOIN tag_types
+ ON interface_tag_types.name = tag_types.tagname;
--- need to temporarily drop constraint on interface_setting_type_id
-ALTER TABLE interface_setting DROP CONSTRAINT interface_setting_interface_setting_type_id_fkey;
+-- need to temporarily drop constraint on interface_tag_type_id
+ALTER TABLE interface_tag DROP CONSTRAINT interface_tag_interface_tag_type_id_fkey;
-- do the transcoding
-UPDATE interface_setting
- SET interface_setting_type_id =
- (select new_index from mgn_setting_renumber where old_index=interface_setting_type_id);
+UPDATE interface_tag
+ SET interface_tag_type_id =
+ (select new_index from mgn_setting_renumber where old_index=interface_tag_type_id);
-- alter column name to reflect change
-ALTER TABLE interface_setting RENAME interface_setting_type_id TO tag_type_id;
+ALTER TABLE interface_tag RENAME interface_tag_type_id TO tag_type_id;
-- add contraint again
-ALTER TABLE interface_setting ADD CONSTRAINT interface_setting_tag_type_id_fkey
+ALTER TABLE interface_tag ADD CONSTRAINT interface_tag_tag_type_id_fkey
FOREIGN KEY (tag_type_id) references tag_types(tag_type_id) ;
--- drop former interface_setting_types altogether
+-- drop former interface_tag_types altogether
drop view mgn_setting_renumber;
-drop table interface_setting_types;
+drop table interface_tag_types;
---------- node tags
-- Interface settings
--------------------------------------------------------------------------------
-CREATE TABLE interface_setting (
- interface_setting_id serial PRIMARY KEY, -- Interface Setting Identifier
+CREATE TABLE interface_tag (
+ interface_tag_id serial PRIMARY KEY, -- Interface Setting Identifier
interface_id integer REFERENCES interfaces NOT NULL,-- the interface this applies to
tag_type_id integer REFERENCES tag_types NOT NULL, -- the setting type
value text -- value attached
) WITH OIDS;
-CREATE OR REPLACE VIEW interface_settings AS
+CREATE OR REPLACE VIEW interface_tags AS
SELECT interface_id,
-array_accum(interface_setting_id) AS interface_setting_ids
-FROM interface_setting
+array_accum(interface_tag_id) AS interface_tag_ids
+FROM interface_tag
GROUP BY interface_id;
-CREATE OR REPLACE VIEW view_interface_settings AS
+CREATE OR REPLACE VIEW view_interface_tags AS
SELECT
-interface_setting.interface_setting_id,
-interface_setting.interface_id,
+interface_tag.interface_tag_id,
+interface_tag.interface_id,
tag_types.tag_type_id,
tag_types.tagname,
tag_types.description,
tag_types.category,
tag_types.min_role_id,
-interface_setting.value
-FROM interface_setting
+interface_tag.value
+FROM interface_tag
INNER JOIN tag_types USING (tag_type_id);
CREATE OR REPLACE VIEW view_interfaces AS
interfaces.dns2,
interfaces.bwlimit,
interfaces.hostname,
-COALESCE((SELECT interface_setting_ids FROM interface_settings WHERE interface_settings.interface_id = interfaces.interface_id), '{}') AS interface_setting_ids
+COALESCE((SELECT interface_tag_ids FROM interface_tags WHERE interface_tags.interface_id = interfaces.interface_id), '{}') AS interface_tag_ids
FROM interfaces;
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Slice/sliver attributes
-CREATE TABLE slice_attribute (
- slice_attribute_id serial PRIMARY KEY, -- Slice attribute identifier
+CREATE TABLE slice_tag (
+ slice_tag_id serial PRIMARY KEY, -- Slice attribute identifier
slice_id integer REFERENCES slices NOT NULL, -- Slice identifier
node_id integer REFERENCES nodes, -- Sliver attribute if set
nodegroup_id integer REFERENCES nodegroups, -- Node group attribute if set
tag_type_id integer REFERENCES tag_types NOT NULL, -- Attribute type identifier
value text
) WITH OIDS;
-CREATE INDEX slice_attribute_slice_id_idx ON slice_attribute (slice_id);
-CREATE INDEX slice_attribute_node_id_idx ON slice_attribute (node_id);
-CREATE INDEX slice_attribute_nodegroup_id_idx ON slice_attribute (nodegroup_id);
+CREATE INDEX slice_tag_slice_id_idx ON slice_tag (slice_id);
+CREATE INDEX slice_tag_node_id_idx ON slice_tag (node_id);
+CREATE INDEX slice_tag_nodegroup_id_idx ON slice_tag (nodegroup_id);
-CREATE OR REPLACE VIEW slice_attributes AS
+CREATE OR REPLACE VIEW slice_tags AS
SELECT slice_id,
-array_accum(slice_attribute_id) AS slice_attribute_ids
-FROM slice_attribute
+array_accum(slice_tag_id) AS slice_tag_ids
+FROM slice_tag
GROUP BY slice_id;
--------------------------------------------------------------------------------
peer_slice.peer_slice_id,
COALESCE((SELECT node_ids FROM slice_nodes WHERE slice_nodes.slice_id = slices.slice_id), '{}') AS node_ids,
COALESCE((SELECT person_ids FROM slice_persons WHERE slice_persons.slice_id = slices.slice_id), '{}') AS person_ids,
-COALESCE((SELECT slice_attribute_ids FROM slice_attributes WHERE slice_attributes.slice_id = slices.slice_id), '{}') AS slice_attribute_ids
+COALESCE((SELECT slice_tag_ids FROM slice_tags WHERE slice_tags.slice_id = slices.slice_id), '{}') AS slice_tag_ids
FROM slices
LEFT JOIN peer_slice USING (slice_id);
-CREATE OR REPLACE VIEW view_slice_attributes AS
+CREATE OR REPLACE VIEW view_slice_tags AS
SELECT
-slice_attribute.slice_attribute_id,
-slice_attribute.slice_id,
-slice_attribute.node_id,
-slice_attribute.nodegroup_id,
+slice_tag.slice_tag_id,
+slice_tag.slice_id,
+slice_tag.node_id,
+slice_tag.nodegroup_id,
tag_types.tag_type_id,
tag_types.tagname,
tag_types.description,
tag_types.category,
tag_types.min_role_id,
-slice_attribute.value
-FROM slice_attribute
+slice_tag.value
+FROM slice_tag
INNER JOIN tag_types USING (tag_type_id);
CREATE OR REPLACE VIEW view_sessions AS
'nm_net_max_rate': 'net_max_rate',
'nm_net_exempt_min_rate': 'net_i2_min_rate',
'nm_net_exempt_max_rate': 'net_i2_max_rate'}
-for slice_attribute in GetSliceAttributes({'name': rename.keys()}):
+for slice_attribute in GetSliceTags({'name': rename.keys()}):
id = slice_attribute['slice_attribute_id']
name = slice_attribute['name']
slice_id = slice_attribute['slice_id']
# Add the new attribute
if GetSlices([slice_id]):
- AddSliceAttribute(slice_id, rename[name], str(kbps))
+ AddSliceTag(slice_id, rename[name], str(kbps))
# Delete the old attribute
- DeleteSliceAttribute(id)
+ DeleteSliceTag(id)
# Convert nm_net_{exempt_,}avg_rate to
# net_{i2_,}max_kbyte and net_{i2_,}thresh_kbyte
'thresh': 'net_thresh_kbyte'},
'nm_net_exempt_avg_rate': {'max': 'net_i2_max_kbyte',
'thresh': 'net_i2_thresh_kbyte'}}
-for slice_attribute in GetSliceAttributes({'name': rename.keys()}):
+for slice_attribute in GetSliceTags({'name': rename.keys()}):
id = slice_attribute['slice_attribute_id']
name = slice_attribute['name']
slice_id = slice_attribute['slice_id']
# Add the new attribute
if GetSlices([slice_id]):
- AddSliceAttribute(slice_id, rename[name]['max'], str(max_kbyte))
- AddSliceAttribute(slice_id, rename[name]['thresh'], str(thresh_kbyte))
+ AddSliceTag(slice_id, rename[name]['max'], str(max_kbyte))
+ AddSliceTag(slice_id, rename[name]['thresh'], str(thresh_kbyte))
# Delete the old attribute
- DeleteSliceAttribute(id)
+ DeleteSliceTag(id)
# Convert plc_slice_state
-for slice_attribute in GetSliceAttributes({'name': 'plc_slice_state'}):
+for slice_attribute in GetSliceTags({'name': 'plc_slice_state'}):
id = slice_attribute['slice_attribute_id']
name = slice_attribute['name']
slice_id = slice_attribute['slice_id']
# Add the new attribute
if GetSlices([slice_id]):
if slice_attribute['value'] == "suspended":
- AddSliceAttribute(slice_id, 'enabled', "0")
+ AddSliceTag(slice_id, 'enabled', "0")
else:
- AddSliceAttribute(slice_id, 'enabled', "1")
+ AddSliceTag(slice_id, 'enabled', "1")
# Delete the old attribute
- DeleteSliceAttribute(id)
+ DeleteSliceTag(id)
# Straight renames
rename = {'nm_cpu_share': 'cpu_share',
'nm_net_max_thresh_byte': 'net_thresh_kbyte',
'nm_net_max_exempt_byte': 'net_i2_max_kbyte',
'nm_net_max_thresh_exempt_byte': 'net_i2_thresh_kbyte'}
-for slice_attribute in GetSliceAttributes({'name': rename.keys()}):
+for slice_attribute in GetSliceTags({'name': rename.keys()}):
id = slice_attribute['slice_attribute_id']
name = slice_attribute['name']
slice_id = slice_attribute['slice_id']
# Add the new attribute
if GetSlices([slice_id]):
- AddSliceAttribute(slice_id, rename[name], value)
+ AddSliceTag(slice_id, rename[name], value)
# Delete the old attribute
- DeleteSliceAttribute(id)
+ DeleteSliceTag(id)
# Update plc_ticket_pubkey attribute
-for slice_attribute in GetSliceAttributes({'name': "plc_ticket_pubkey"}):
+for slice_attribute in GetSliceTags({'name': "plc_ticket_pubkey"}):
id = slice_attribute['slice_attribute_id']
- UpdateSliceAttribute(id, """
+ UpdateSliceTag(id, """
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKXa72MEKDAnVyzEpKOB1ot2eW
xG/TG2aa7q/2oy1xf5XMmU9H9uKwO+GoUeinp1BSxgkVRF0VhEGGaqKR9kYQzX0k
ht4+P2hAr+UyU4cp0NxV4xfmyAbrNKuHVjawMUCu5BH0IkBUC/89ckxk71oROnak
""".lstrip())
# Delete _deleted and deprecated slice attributes and types
-for attribute_type in GetSliceAttributeTypes():
+for attribute_type in GetSliceTagTypes():
id = attribute_type['attribute_type_id']
name = attribute_type['name']
if name == 'general_prop_share' or \
re.match('nm_', name) or \
re.search('_deleted$', name):
- DeleteSliceAttributeType(id)
+ DeleteSliceTagType(id)
# N.B. Automatically deletes all slice attributes of this type
# Add Proper ops
for slice, op in proper_ops:
try:
- AddSliceAttribute(slice, 'proper_op', op)
+ AddSliceTag(slice, 'proper_op', op)
except Exception, err:
print "Warning: %s:" % slice, err
initscripts = dict([(initscript['initscript_id'], initscript) for initscript in [{'initscript_id': 8, 'script': 'IyEgL2Jpbi9zaA0KDQojIDxQcm9ncmFtIE5hbWU+DQojICAgIGJpbmRzY3JpcHQNCiMNCiMgPEF1dGhvcj4NCiMgICAgSmVmZnJ5IEpvaG5zdG9uIGFuZCBKZXJlbXkgUGxpY2h0YQ0KIw0KIyA8UHVycG9zZT4NCiMgICAgRG93bmxvYWRzIGFuZCBpbnN0YWxscyBzdG9yayBvbiBhIG5vZGUuDQoNCiMgc2F2ZSBvcmlnaW5hbCBQV0QNCk9MRFBXRD0kUFdEDQoNCiMgZXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9uDQplcnJvcigpDQp7DQogICBlY2hvDQogICBlY2hvICJQbGVhc2UgRS1tYWlsIHN0b3JrLXN1cHBvcnRAY3MuYXJpem9uYS5lZHUgaWYgeW91IGJlbGlldmUgeW91IGhhdmUiIA0KICAgZWNobyAicmVjZWl2ZWQgdGhpcyBtZXNzYWdlIGluIGVycm9yLiINCg0KICAgIyBnZXQgcmlkIG9mIENFUlQgZmlsZQ0KICAgaWYgWyAtZiAkQ0VSVCBdDQogICB0aGVuDQogICAgICBybSAtZiAkQ0VSVCA+IC9kZXYvbnVsbA0KICAgZmkNCg0KICAgIyByZXN0b3JlIG9yaWdpbmFsIFBXRA0KICAgY2QgJE9MRFBXRA0KICAgZXhpdCAxDQp9DQoNCkNFUlQ9YHB3ZGAvdGVtcGNydGZpbGUNCg0KI2Z1bmN0aW9ucw0KDQojIyMNCiMjIyBjcmVhdGVDZXJ0aWZpY2F0ZSgpDQojIyMgICAgcHJpbnRzIG91dCB0aGUgZXF1aWZheCBjZXJ0aWZpY2F0ZSB0byB1c2UgYW5kIHN0b3Jlcw0KIyMjICAgIHRoZSBmaWxlIG5hbWUgaW4gJENFUlQNCiMjIw0KZnVuY3Rpb24gY3JlYXRlQ2VydGlmaWNhdGUoKXsNCmNhdCA+ICRDRVJUIDw8RVFVSUZBWA0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlDa0RDQ0FmbWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVFGQURCYU1Rc3dDUVlEVlFRR0V3SlYNClV6RWNNQm9HQTFVRUNoTVRSWEYxYVdaaGVDQlRaV04xY21VZ1NXNWpMakV0TUNzR0ExVUVBeE1rUlhGMQ0KYVdaaGVDQlRaV04xY21VZ1IyeHZZbUZzSUdWQ2RYTnBibVZ6Y3lCRFFTMHhNQjRYRFRrNU1EWXlNVEEwDQpNREF3TUZvWERUSXdNRFl5TVRBME1EQXdNRm93V2pFTE1Ba0dBMVVFQmhNQ1ZWTXhIREFhQmdOVkJBb1QNCkUwVnhkV2xtWVhnZ1UyVmpkWEpsSUVsdVl5NHhMVEFyQmdOVkJBTVRKRVZ4ZFdsbVlYZ2dVMlZqZFhKbA0KSUVkc2IySmhiQ0JsUW5WemFXNWxjM01nUTBFdE1UQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3DQpnWWtDZ1lFQXV1Y1hrQUpsc1RSVlBFbkNVZFhmcDlFM2o5SG5nWE5CVW1DYm5hRVhKbml0eDdIb0pwUXkNCnRkNHpqVG92Mi9LYWVscHptS05jNmZ1S2N4dGM1OE8vZ0d6TnFmVFdLOEQzK1ptcVk2S3hSd0lQMU9SUg0KT2hJOGJJcGFWSVJ3MjhIRmtNOXlSY3VvV2NETk01MC9vNWJyaFRNaEhENGVQbUJ1ZHB4bmhjWEl3MkVDDQpBd0VBQWFObU1HUXdFUVlKWUlaSUFZYjRRZ0VCQkFRREFnQUhNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHcNCkh3WURWUjBqQkJnd0ZvQVV2cWlnZEhKUWEwUzN5U1BZKzZqL3MxZHJhR3d3SFFZRFZSME9CQllFRkw2bw0Kb0hSeVVHdEV0OGtqMlB1by83TlhhMmhzTUEwR0NTcUdTSWIzRFFFQkJBVUFBNEdCQUREaUFWR3F4K3BmDQoycm5RWlE4dzFqN2FEUlJKYnBHVEp4UXg3OFQzTFVYNDdNZS9va0VOSTdTUytSa0FaNzBCcjgzZ2NmeGENCnoyVEU0SmFZMEtOQTRnR0s3eWNIOFdVQmlrUXRCbVYxVXNDR0VDQWhYMnhyRDJ5dUNSeXY4cUlZTk1SMQ0KcEhNYzhZM2M3NjM1czNhMGtyL2NsUkFldnN2SU8xcUVZQmxXbEtsVg0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSANCkVRVUlGQVgNCn0NCg0KIyMjDQojIyMgb3ZlcldyaXRlQ29uZigpDQojIyMJb3ZlcndyaXRlIHRoZSBkZWZhdWx0IHN0b3JrLmNvbmYgZmlsZQ0KIyMjICAgICB0aGF0IHdhcyBpbnN0YWxsZWQgYnkgdGhlIHJwbSBwYWNrYWdlLg0KIyMjICAgICB0aGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgYmVjYXVzZSBJIG5lZWQNCiMjIyAgICAgdG8gY2hhbmdlIHRoZSBuZXN0cG9ydCBhbmQgSSBkb250IGtub3cNCiMjIyAgICAgZW5vdWdoIHRvIHJlcGFja2FnZSB0aGUgcnBtIHdpdGggdGhlDQojIyMgICAgIGNvcnJlY3Qgc2V0dGluZ3MNCmZ1bmN0aW9uIG92ZXJXcml0ZUNvbmYoKXsNCmNhdCA+IC91c3IvbG9jYWwvc3RvcmsvZXRjL3N0b3JrLmNvbmYgPDxFTkRPRkZJTEUNCnBhY21hbj0vdXNyL2xvY2FsL3N0b3JrL2Jpbi9wYWNtYW4NCmR0ZC1wYWNrYWdlcz0vdXNyL2xvY2FsL3N0b3JrL2Jpbi9wYWNrYWdlcy5kdGQNCmR0ZC1ncm91cHM9L3Vzci9sb2NhbC9zdG9yay9iaW4vZ3JvdXBzLmR0ZA0Kc3RvcmtuZXN0dXBkYXRlbGlzdGVuZXJwb3J0PTY0OQ0KDQojYml0dG9ycmVudHRyYWNrZXJob3N0PXF1YWRydXMuY3MuYXJpem9uYS5lZHUNCmJpdHRvcnJlbnR0cmFja2VyaG9zdD1ucjA2LmNzLmFyaXpvbmEuZWR1DQoNCmJpdHRvcnJlbnR0cmFja2VycG9ydD02ODgwDQpiaXR0b3JyZW50dXBsb2FkcmF0ZT0wDQpiaXR0b3JyZW50c2VlZGxvb2t1cHRpbWVvdXQ9MzANCg0KI3BhY2thZ2VyZXBvc2l0b3J5ID0gcXVhZHJ1cy5jcy5hcml6b25hLmVkdS9QbGFuZXRMYWIvVjN8ZGlzdCwgc3RhYmxlDQpwYWNrYWdlcmVwb3NpdG9yeSA9IG5yMDYuY3MuYXJpem9uYS5lZHUvUGxhbmV0TGFiL1YzfGRpc3QsIHN0YWJsZQ0KI3BhY2thZ2VpbmZvcmVwb3NpdG9yeSA9IHF1YWRydXMuY3MuYXJpem9uYS5lZHUvUGxhbmV0TGFiL1YzL3N0b3JrLmluZm8NCnBhY2thZ2VpbmZvcmVwb3NpdG9yeSA9IG5yMDYuY3MuYXJpem9uYS5lZHUvUGxhbmV0TGFiL1YzL3N0b3JrLmluZm8NCg0KdXNlcm5hbWUgPSBQbGFuZXRMYWINCnB1YmxpY2tleWZpbGUgPSAvdXNyL2xvY2FsL3N0b3JrL3Zhci9rZXlzL1BsYW5ldExhYi5wdWJsaWNrZXkNCnBhY2thZ2VtYW5hZ2VycyA9IG5lc3RycG0sIHJwbSwgdGFyZ3oNCnRyYW5zZmVybWV0aG9kPSBuZXN0LGJpdHRvcnJlbnQsY29ibGl0eixjb3JhbCxodHRwLGZ0cA0KbmVzdHBvcnQ9NjAwMA0KdGFycGFja2luZm9wYXRoPS91c3IvbG9jYWwvc3RvcmsvdmFyL3RhcmluZm8NCkVORE9GRklMRQ0KfSANCg0KDQojIyMNCiMjIyBkb3dubG9hZE5SMDYoKQ0KIyMjICAgIGRvd25sb2FkIGEgZmlsZSBmcm9tIG5yMDYgdXNpbmcgY3VybA0KIyMjDQojIyMgYXJnczogDQojIyMgICAgICAgLSB0aGUgcGF0aCBvZiB0aGUgZmlsZSB5b3Ugd2lzaCB0byBkb3dubG9hZA0KIyMjICAgICAgICAgcmVsYXRpdmUgZnJvbSBodHRwczovL25yMDYuY3MuYXJpem9uYS5lZHUNCiMjIyAgICAgICAtIHRoZSBmaWxlIHRvIHNhdmUgaXQgdG8NCiMjIyAgICAgICAtIHJldHVybmVkIHZhbHVlIGFzIHNwZWNpZmllZCBpbiB2ZXJpZnlEb3dubG9hZA0KZnVuY3Rpb24gZG93bmxvYWROUjA2KCl7DQogICAgY3VybCAtLWNhY2VydCAkQ0VSVCBodHRwczovL25yMDYuY3MuYXJpem9uYS5lZHUvJDEgLW8gJDIgMj4vZGV2L251bGwNCiAgICB2ZXJpZnlEb3dubG9hZCAkMiAkMw0KfQ0KDQojIyMNCiMjIyB2ZXJpZnlEb3dubG9hZCgpDQojIyMgICAgIHZlcmlmeSB0aGF0IGEgZmlsZSB0aGF0IHdhcyBqdXN0IGRvd25sb2FkIHdpdGggZG93bmxvYWROUjA2DQojIyMgICAgIHdhcyBkb3dubG9hZCBjb3JyZWN0bHkuIFNpbmNlIHdlIGFyZSBnZXR0aW5nIHN0dWZmIGZyb20gYQ0KIyMjICAgICBodHRwIHNlcnZlciB3ZSBhcmUgYXNzdW1pbmcgdGhhdCBpZiB3ZSBnZXQgYSA0MDQgcmVzcG9uc2UNCiMjIyAgICAgdGhhdCB0aGUgcGFnZSB3ZSB3YW50IGRvZXMgbm90IGV4aXN0LiBBbHNvLCBpZiB0aGUgb3V0cHV0IGZpbGUNCiMjIyAgICAgZG9lcyBub3QgZXhpc3QgdGhhdCBtZWFucyB0aGF0IG9ubHkgaGVhZGVycyB3ZXJlIHJldHVybmVkDQojIyMgICAgIHdpdGhvdXQgYW55IGNvbnRlbnQuIHRoaXMgdG9vIGlzIGEgaW52YWxpZCBmaWxlIGRvd25sb2FkDQojIyMNCiMjIyBhcmdzOg0KIyMjICAgICAgIC0gdGhlIGZpbGUgdG8gdmVyaWZ5DQojIyMgICAgICAgLSByZXR1cm4gdmFyaWFibGUsIHdpbGwgaGF2ZSAxIGlmIGZhaWwgMCBpZiBnb29kDQojIyMNCmZ1bmN0aW9uIHZlcmlmeURvd25sb2FkKCl7DQogICAgZXZhbCAiJDI9MCINCiAgICBpZiBbICEgLWYgJDEgXTsNCiAgICB0aGVuDQogICAgICAgIGV2YWwgIiQyPTEiDQogICAgZWxpZiBncmVwICc0MDQgTm90IEZvdW5kJyAkMSA+IC9kZXYvbnVsbA0KICAgIHRoZW4NCglybSAtZiAkMQ0KICAgICAgICBldmFsICIkMj0xIg0KICAgIGVsc2UNCiAgICAgICAgZXZhbCAiJDI9MCINCiAgICBmaQ0KfQ0KDQoNCiMgY2hlY2sgZm9yIHJvb3QgdXNlcg0KaWYgWyAkVUlEIC1uZSAiMCIgXQ0KdGhlbg0KICAgZWNobyAiWW91IG11c3QgcnVuIHRoaXMgcHJvZ3JhbSB3aXRoIHJvb3QgcGVybWlzc2lvbnMuLi4iDQogICBlcnJvcg0KZmkgICANCiANCiMgY2xlYW4gdXAgaW4gY2FzZSB0aGlzIHNjcmlwdCB3YXMgcnVuIGJlZm9yZSBhbmQgZmFpbGVkDQpybSAtcmYgL3RtcC9zdG9yayAmPiAvZGV2L251bGwNCg0KIyBjcmVhdGUgL3RtcC9zdG9yayBkaXJlY3RvcnkNCm1rZGlyIC90bXAvc3RvcmsgDQppZiBbICQ/IC1uZSAiMCIgXQ0KdGhlbg0KICAgZWNobw0KICAgZWNobyAiQ291bGQgbm90IGNyZWF0ZSB0aGUgL3RtcC9zdG9yayBkaXJlY3RvcnkuLi4iDQogICBlcnJvcg0KZmkNCg0KIyBleHBvcnQgb3VyIHJvb3QgZGlyZWN0b3J5IHRvIFN0b3JrDQplY2hvICJhcml6b25hX3N0b3JrMiIgPiAvLmV4cG9ydGRpcg0KaWYgWyAkPyAtbmUgIjAiIF0NCnRoZW4NCiAgIGVjaG8NCiAgIGVjaG8gIkNvdWxkIG5vdCBjcmVhdGUgdGhlIC8uZXhwb3J0ZGlyIGZpbGUuLi4iDQogICBlcnJvcg0KZmkNCiANCiMgdGVsbCBzdG9yayB0aGF0IHdlIHdhbnQgdG8gYmUgc2VydmVkDQppZiBbIC1mIC9ldGMvc2xpY2VuYW1lIF0NCnRoZW4NCiAgIFNMSUNFTkFNRT1gY2F0IC9ldGMvc2xpY2VuYW1lYA0KZWxzZSANCiAgIFNMSUNFTkFNRT0kVVNFUg0KZmkNCndnZXQgLU8gL3RtcC9zdG9yay8kU0xJQ0VOQU1FICJodHRwOi8vbG9jYWxob3N0OjY0OC8kU0xJQ0VOQU1FXCRiaW5kc2NyaXB0Ig0KDQojIHZlcmlmeSB0aGF0IHRoZSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bA0KaWYgWyAhIC1mIC90bXAvc3RvcmsvJFNMSUNFTkFNRSAtbyAkPyAtbmUgMCBdDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJTdG9yayBkb2Vzbid0IHNlZW0gdG8gYmUgcnVubmluZyBvbiB0aGlzIG5vZGUuLi4iDQogICBlcnJvcg0KZmkNCg0KIyB3YWl0IGZvciBzdG9yayBzbGljZSANCmVjaG8gIldhaXRpbmcgZm9yIFN0b3JrIHRvIGFjY2VwdCBvdXIgYmluZGluZy4uLiINCndoaWxlIFsgISAtZiAvdG1wL3N0b3JrL3N0b3JrX3NheXNfZ28gXQ0KZG8NCiAgIHNsZWVwIDENCmRvbmUNCg0KIyBjaGFuZ2UgUFdEIHRvIHRoZSAvdG1wL3N0b3JrIGRpcmVjdG9yeSANCmNkIC90bXAvc3RvcmsNCmlmIFsgJD8gLW5lICIwIiBdDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJDb3VsZCBub3QgYWNjZXNzIHRoZSAvdG1wL3N0b3JrIGRpcmVjdG9yeS4uLiINCiAgIGVycm9yDQpmaQ0KDQojIGNvbmZpcm0gdGhhdCBwYWNrYWdlcyB0byBiZSBpbnN0YWxsZWQgYWN0dWFsbHkgZXhpc3QNCmlmIGVjaG8gKi5ycG0gfCBncmVwICcqJyA+IC9kZXYvbnVsbA0KdGhlbg0KICAgZWNobw0KICAgZWNobyAiRXJyb3I6IFN0b3JrIHBhY2thZ2UgZG93bmxvYWQgZmFpbGVkLi4uIg0KICAgZXJyb3INCmZpDQoNCiMgcmVtb3ZlIFN0b3JrIHBhY2thZ2VzIGFuZCBmaWxlcw0KZWNobw0KZWNobyAiUmVtb3ZpbmcgU3RvcmsgZmlsZXMuLi4iDQoNCiMgYnVpbGQgYSBsaXN0IG9mIHBhY2thZ2VzIHRvIHJlbW92ZQ0KcGFja2FnZXM9IiINCmZvciBmaWxlbmFtZSBpbiAqLnJwbQ0KZG8NCiAgIyBjb252ZXJ0IGZpbGVuYW1lIHRvIGEgcGFja2FnZSBuYW1lDQogIHBhY2s9YHJwbSAtcXAgLS1xZiAiJXtOQU1FfVxuIiAkZmlsZW5hbWVgDQogIGlmIFsgJD8gLWVxICIwIiBdDQogIHRoZW4NCiAgICBwYWNrYWdlcz0iJHBhY2thZ2VzICRwYWNrIg0KICBmaQ0KZG9uZSAgIA0KDQojIHJlbW92ZSBvbGQgU3RvcmsgcGFja2FnZXMNCnJwbSAtZSAkcGFja2FnZXMgJj4gL2Rldi9udWxsDQoNCiMgcmVtb3ZlIGFueXRoaW5nIGxlZnQgaW4gL3Vzci9sb2NhbC9zdG9yay9iaW4NCnJtIC1yZiAvdXNyL2xvY2FsL3N0b3JrL2Jpbi8qICY+IC9kZXYvbnVsbCANCg0KIyBpbnN0YWxsIFN0b3JrIHBhY2thZ2VzDQplY2hvDQplY2hvICJJbnN0YWxsaW5nIHBhY2thZ2VzLi4uIiANCg0KIyBidWlsZCBhIGxpc3Qgb2YgcGFja2FnZXMgdG8gaW5zdGFsbA0KcGFja2FnZXM9IiINCmZvciBmaWxlbmFtZSBpbiAqLnJwbQ0KZG8NCiAgcGFja2FnZXM9IiRwYWNrYWdlcyAkZmlsZW5hbWUiDQpkb25lICAgDQoNCiMgaW5zdGFsbCB0aGUgbmV3IHN0b3JrIHBhY2thZ2VzDQpycG0gLWkgJHBhY2thZ2VzDQoNCiMgcmVwb3J0IHBhY2thZ2UgaW5zdGFsbGF0aW9uIGVycm9ycw0KaWYgWyAkPyAtbmUgIjAiIF0NCnRoZW4NCiAgZWNobyAiV2FybmluZzogUG9zc2libGUgZXJyb3IgaW5zdGFsbGluZyBTdG9yayBwYWNrYWdlcy4uLiINCmZpDQoNCiMgcmVzdG9yZSBvcmlnaW5hbCBQV0QNCmNkICRPTERQV0QNCg0KIyBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMNCnJtIC1yZiAvdG1wL3N0b3JrICY+IC9kZXYvbnVsbA0KDQojIFNFRSBUTy1ETyAxDQojY3JlYXRlIHRoZSBlcXVpZmF4IGNlcnRpZmljYXRlIHRvIHVzZSBmb3IgY3VybA0KI2NyZWF0ZUNlcnRpZmljYXRlDQoNCiMgVE8tRE8gMQ0KIyBpbXBsZW1lbnQgdGhlIGJlbG93IGluIHRoZSBiZWdnaW5pbmcgb2Ygc3RvcmsucHkNCiNhdHRlbXB0IHRvIGRvd25sb2FkIHRoZSB1c2VycyBwdWJsaWMga2V5IGZyb20gdGhlIHJlcG9zaXRvcnkNCiNkb3dubG9hZE5SMDYgInVzZXItdXBsb2FkL3B1YmtleXMvJFNMSUNFTkFNRS5wdWJsaWNrZXkiICIvdXNyL2xvY2FsL3N0b3JrL3Zhci8kU0xJQ0VOQU1FLnB1YmxpY2tleSIgUkVUDQoNCiNpZiBbICRSRVQgLW5lIDAgXTsNCiN0aGVuDQojICAgZWNobw0KIyAgIGVjaG8gIkNvdWxkIG5vdCBmZXRjaCB5b3VyIHB1YmxpYyBrZXkgZnJvbSB0aGUgcmVwb3NpdG9yeS4iDQojICAgZWNobyAiSWYgeW91IHdhbnQgdG8gdXBsb2FkIG9uZSBmb3IgdGhlIG5leHQgdGltZSB5b3UgcnVuIg0KIyAgIGVjaG8gInRoZSBpbml0c2NyaXB0IHBsZWFzZSB2aXNpdCINCiMgICBlY2hvICJodHRwOi8vbnIwNi5jcy5hcml6b25hLmVkdS90ZXN0cGhwL3VwbG9hZC5waHAiDQojICAgZWNobw0KI2ZpDQoNCiNhdHRlbXB0IHRvIGRvd25sb2FkIHRoZSB1c2VycyBzdG9yay5jb25mIGZpbGUgZnJvbSB0aGUgcmVwb3NpdG9yeQ0KI2Rvd25sb2FkTlIwNiAidXNlci11cGxvYWQvY29uZi8kU0xJQ0VOQU1FLnN0b3JrLmNvbmYiICIvdXNyL2xvY2FsL3N0b3JrL2V0Yy9zdG9yay5jb25mLnVzZXJzIiBSRVQNCg0KI2lmIFsgJFJFVCAtbmUgMCBdOw0KI3RoZW4NCiMgICBlY2hvDQojICAgZWNobyAiQ291bGQgbm90IGZldGNoIHlvdXIgc3RvcmsuY29uZiBmaWxlIGZyb20gdGhlIHJlcG9zaXRvcnkuIg0KIyAgIGVjaG8gIklmIHlvdSB3YW50IHRvIHVwbG9hZCBvbmUgZm9yIHRoZSBuZXh0IHRpbWUgeW91IHJ1biINCiMgICBlY2hvICJ0aGUgaW5pdHNjcmlwdCBwbGVhc2UgdmlzaXQiDQojICAgZWNobyAiaHR0cDovL25yMDYuY3MuYXJpem9uYS5lZHUvdGVzdHBocC91cGxvYWQucGhwIg0KIyAgIGVjaG8gIlN0b3JrIHdpbGwgd29yayB3aXRob3V0IGEgY29uZmlndXJhdGlvbiBmaWxlIGJ1dCB0byBtYWtlIG9uZSINCiMgICBlY2hvICJwbGVhc2UgcGxhY2UgYSBmaWxlIG5hbWVkIHN0b3JrLmNvbmYgaW4gL3Vzci9sb2NhbC9zdG9yay9ldGMiDQojICAgZWNobyAicmVmZXIgdG8gdGhlIG1hbnVhbCBmb3IgbW9yZSBkaXJlY3Rpb25zIG9yIGVtYWlsOiINCiMgICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhZGRpdGlvbmFsIGFzc2lzdGFuY2UuIg0KIyAgIGVjaG8NCiNmaQ0KDQojZG9udCBuZWVkIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBjb25mIGZpbGUNCiNiZWNhdXNlIGl0IHNob3VsZCBiZSBmaXhlZCBpbiB0aGUgbmV3IHJwbXMNCiNvdmVyV3JpdGVDb25mDQoNCiMgcnVuIHN0b3JrIHRvIHVwZGF0ZSBrZXlmaWxlcyBhbmQgZG93bmxvYWQgcGFja2FnZSBsaXN0cw0KZWNobw0KZWNobyAiQXR0ZW1wdGluZyB0byBjb21tdW5pY2F0ZSB3aXRoIHN0b3JrLi4uIg0KaWYgc3RvcmsgDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJDb25ncmF0dWxhdGlvbnMsIHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBib3VuZCB0byBzdG9yayEiDQogICBlY2hvDQogICBlY2hvICJGb3IgaGVscCwgeW91IG1heSB0eXBlIHN0b3JrIC0taGVscCINCiAgIGVjaG8NCiAgICNlY2hvICJUaGVyZSBpcyBhbHNvIGEgc3RvcmtxdWVyeSBjb21tYW5kIHRoYXQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIg0KICAgI2VjaG8gImFib3V0IHBhY2thZ2VzIGluIHRoZSByZXBvc2l0b3J5LiINCiAgIGVjaG8NCiAgIGVjaG8gIkZvciBtb3JlIGhlbHAsIHZpc2l0IHRoZSBzdG9yayBwcm9qZWN0IG9ubGluZSBhdCINCiAgIGVjaG8gImh0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUvc3RvcmsvLiAgUGxlYXNlIGNvbnRhY3QiDQogICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhZGRpdGlvbmFsIGFzc2lzdGFuY2UuIiANCiAgICNybSAtZiAkQ0VSVCA+IC9kZXYvbnVsbA0KZWxzZQ0KICAgZWNobw0KICAgZWNobyAiQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGluc3RhbGwgZmluYWxpemF0aW9uLi4uICBQbGVhc2UgY29udGFjdCINCiAgIGVjaG8gInN0b3JrLXN1cHBvcnRAY3MuYXJpem9uYS5lZHUgZm9yIGFzc2lzdGFuY2UuIg0KICAgI3JtIC1mICRDRVJUID4gL2Rldi9udWxsDQogICBleGl0IDENCmZpDQoNCiMgZG9uZQ0KZXhpdCAwDQo=', 'name': 'arizona_stork_2', 'encoding': 'base64'}, {'initscript_id': 9, 'script': 'IyEvYmluL2Jhc2gNCmNkIC8NCnJtIC1mIHN0YXJ0X3B1cnBsZQ0Kd2dldCBodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRlaXNlbnN0L3B1cnBsZS9zdGFydF9wdXJwbGUNCmNobW9kIDc1NSBzdGFydF9wdXJwbGUNCnN1IHByaW5jZXRvbl9wdXJwbGUgLWMgJy4vc3RhcnRfcHVycGxlJw0K', 'name': 'princeton_purple', 'encoding': 'base64'}, {'initscript_id': 6, 'script': 'IyEgL2Jpbi9zaA0KDQojIHNhdmUgb3JpZ2luYWwgUFdEDQpPTERQV0Q9JFBXRA0KDQojIGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbg0KZXJyb3IoKQ0Kew0KICAgZWNobw0KICAgZWNobyAiUGxlYXNlIEUtbWFpbCBzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGlmIHlvdSBiZWxpZXZlIHlvdSBoYXZlIiANCiAgIGVjaG8gInJlY2VpdmVkIHRoaXMgbWVzc2FnZSBpbiBlcnJvci4iDQoNCiAgICMgcmVzdG9yZSBvcmlnaW5hbCBQV0QNCiAgIGNkICRPTERQV0QNCiAgIGV4aXQgMQ0KfQ0KDQojIGNoZWNrIGZvciByb290IHVzZXINCmlmIFsgJFVJRCAtbmUgIjAiIF0NCnRoZW4NCiAgIGVjaG8gJ1lvdSBtdXN0IGJlIHJvb3QgdG8gcnVuIHRoaXMgcHJvZ3JhbS4uLicNCiAgIGVycm9yDQpmaSAgIA0KIA0KIyBDbGVhbiB1cCBpbiBjYXNlIEkgcmFuIHRoaXMgYmVmb3JlDQpybSAtZiAvdG1wL3N0b3JrKiA+IC9kZXYvbnVsbCAyPiYxDQoNCiMgRmlyc3Qgb2YgYWxsIGV4cG9ydCBvdXIgcm9vdCBkaXJlY3RvcnkgdG8gU3RvcmsNCmVjaG8gImFyaXpvbmFfc3RvcmsiID4gLy5leHBvcnRkaXINCiANCiMgTm93IHRlbGwgc3RvcmsgdGhhdCB3ZSB3YW50IHRvIGJlIHNlcnZlZA0KaWYgWyAtZiAvZXRjL3NsaWNlbmFtZSBdDQp0aGVuDQogICBTTElDRU5BTUU9YGNhdCAvZXRjL3NsaWNlbmFtZWANCmVsc2UgDQogICBTTElDRU5BTUU9JFVTRVINCmZpDQoNCndnZXQgaHR0cDovL2xvY2FsaG9zdDo2NDAvJFNMSUNFTkFNRQ0KDQojIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwNCmlmIFsgISAtZiAkU0xJQ0VOQU1FIC1vICQ/IC1uZSAwIF0NCnRoZW4NCiAgIGVjaG8NCiAgIGVjaG8gIlN0b3JrIGRvZXNuJ3Qgc2VlbSB0byBiZSBydW5uaW5nIG9uIHRoaXMgbm9kZS4uLiINCiAgIGVycm9yDQpmaQ0KDQojIHdhaXQgZm9yIHN0b3JrIHNsaWNlIA0KZWNobyAiV2FpdGluZyBmb3IgU3RvcmsgdG8gYWNjZXB0IG91ciBiaW5kaW5nLi4uIg0Kd2hpbGUgWyAhIC1mIC90bXAvc3Rvcmtfc2F5c19nbyBdDQpkbw0KICAgc2xlZXAgMQ0KZG9uZQ0KDQojIGNoYW5nZSBQV0QgdG8gdGhlIC90bXAgZGlyZWN0b3J5IA0KY2QgL3RtcA0KaWYgWyAkPyAtbmUgIjAiIF0NCnRoZW4NCiAgIGVjaG8NCiAgIGVjaG8gIkNvdWxkIG5vdCBhY2Nlc3MgdGhlIC90bXAgZGlyZWN0b3J5Li4uIg0KICAgZXJyb3INCmZpDQoNCiMgY29uZmlybSB0aGF0IHBhY2thZ2VzIHRvIGJlIGluc3RhbGxlZCBhY3R1YWxseSBleGlzdA0KaWYgZWNobyAqLnJwbSB8IGdyZXAgJyonID4gL2Rldi9udWxsDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJFcnJvcjogU3RvcmsgcGFja2FnZSBkb3dubG9hZCBmYWlsZWQuLi4iDQogICBlcnJvcg0KZmkNCg0KIyBpbnN0YWxsIFN0b3JrIHBhY2thZ2VzDQplY2hvICJJbnN0YWxsaW5nIHBhY2thZ2VzLi4uIiANCmZvciBwYWNrIGluICoucnBtDQpkbw0KICAgIyByZW1vdmUgdGhlIG9sZCBzdG9yayBwYWNrYWdlLCBpZiBhbnkNCiAgIHJwbSAtZSBgcnBtIC1xcCAtLXFmICIle05BTUV9XG4iICRwYWNrYCA+IC9kZXYvbnVsbCAyPiYxDQoNCiAgICMgcmVtb3ZlIGFueXRoaW5nIGxlZnQgaW4gL3Vzci9sb2NhbC9zdG9yay9iaW4NCiAgIHJtIC1yZiAvdXNyL2xvY2FsL3N0b3JrL2Jpbi8qID4gL2Rldi9udWxsIDI+JjENCg0KICAgIyBpbnN0YWxsIHRoZSBuZXcgc3RvcmsgcGFja2FnZQ0KICAgcnBtIC1pICRwYWNrDQoNCiAgICMgcmVwb3J0IHBhY2thZ2UgaW5zdGFsbGF0aW9uIGVycm9ycw0KICAgaWYgWyAkPyAtbmUgIjAiIF0NCiAgIHRoZW4NCiAgICAgZWNobyAiV2FybmluZzogUG9zc2libGUgZXJyb3IgaW5zdGFsbGluZyBTdG9yayBwYWNrYWdlOiAkcGFjay4uLiINCiAgIGZpDQpkb25lDQoNCiMgcmVzdG9yZSBvcmlnaW5hbCBQV0QNCmNkICRPTERQV0QNCg0KIyBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMNCnJtIC1mIC90bXAvc3RvcmsqID4gL2Rldi9udWxsIDI+JjENCnJtICRTTElDRU5BTUUqIA0KDQojIHJ1biBzdG9yayB0byB1cGRhdGUga2V5ZmlsZXMgYW5kIGRvd25sb2FkIHBhY2thZ2UgbGlzdHMNCmVjaG8gIkF0dGVtcHRpbmcgdG8gY29tbXVuaWNhdGUgd2l0aCBzdG9yay4uLiINCmlmIHN0b3JrIA0KdGhlbg0KICAgZWNobw0KICAgZWNobyAiQ29uZ3JhdHVsYXRpb25zLCB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkgYm91bmQgdG8gc3RvcmshIg0KICAgZWNobw0KICAgZWNobyAiRm9yIGhlbHAsIHlvdSBtYXkgdHlwZSBzdG9yayAtLWhlbHAgIg0KICAgZWNobw0KICAgZWNobyAiVGhlcmUgaXMgYWxzbyBhIHN0b3JrcXVlcnkgY29tbWFuZCB0aGF0IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiINCiAgIGVjaG8gImFib3V0IHBhY2thZ2VzIGluIHRoZSByZXBvc2l0b3J5LiINCiAgIGVjaG8NCiAgIGVjaG8gIkZvciBtb3JlIGhlbHAsIHZpc2l0IHRoZSBzdG9yayBwcm9qZWN0IG9ubGluZSBhdCINCiAgIGVjaG8gImh0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUvc3RvcmsvLiAgUGxlYXNlIGNvbnRhY3QiDQogICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhZGRpdGlvbmFsIGFzc2lzdGFuY2UuIiANCmVsc2UNCiAgIGVjaG8NCiAgIGVjaG8gIkFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBpbnN0YWxsIGZpbmFsaXphdGlvbi4uLiAgUGxlYXNlIGNvbnRhY3QiDQogICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhc3Npc3RhbmNlLiINCiAgIGV4aXQgMQ0KZmkNCg0KIw0KIyBIZWxsbyBXb3JsZCBkZW1vIGNvZGUNCiMNCg0KIyBQdWJsaWMga2V5IGZvciB0aGlzIGRlbW8NCmNhdCA+L3Vzci9sb2NhbC9zdG9yay92YXIva2V5cy9oZWxsby5wdWJsaWNrZXkgPDwiRU9GIg0KLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0NCk1Gd3dEUVlKS29aSWh2Y05BUUVCQlFBRFN3QXdTQUpCQU1XcVE3K2VxQVljNlRPSUJPbkJyRnZqYjlnRVViaWgNCkkxd0Nyeld4a09aa01BcXFmY1RuMW9tcCtLMGd0cUtBK3VaNEIzRGlQRXI0Q0V0Myt5MmJlMGtDQXdFQUFRPT0NCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ0KRU9GDQpzZWQgLWkgLWUgJ3MvXnVzZXJuYW1lLiovdXNlcm5hbWUgPSBoZWxsby8nIC91c3IvbG9jYWwvc3RvcmsvZXRjL3N0b3JrLmNvbmYNCg0KIyBJbnN0YWxsIFJQTQ0Kc3RvcmsgdXBncmFkZSBoZWxsbw0KDQojIGVuZA0KZXhpdCAwDQo=', 'name': 'princeton_hello_stork', 'encoding': 'base64'}, {'initscript_id': 10, 'script': 'IyEvYmluL2Jhc2gNCg0KIyBJbml0IHNjcmlwdCBmb3IgdGhlIFBsYW5ldExhYiAiSGVsbG8gV29ybGQiIGRlbW8gdXNpbmcgR29vZ2xlIEVhcnRoLg0KIyBJbnN0YWxscyBhIGNyb250YWIgZW50cnkgb24gdGhlIG5vZGUgdGhhdCBwaG9uZXMgaG9tZSB0byB0aGUgc2VydmVyDQojIGV2ZXJ5IHRocmVlIG1pbnV0ZXMuDQoNClNFUlZFUj0xMjguMTEyLjEzOS43Mzo4MDQyCQkjIHBsYW5ldGxhYi0zLmNzLnByaW5jZXRvbi5lZHUNCg0KL3Vzci9iaW4vY3VybCAtcyBodHRwOi8vJFNFUlZFUi8NCmVjaG8gIiovNSAqICogKiAqIC91c3IvYmluL2N1cmwgLXMgaHR0cDovLyRTRVJWRVIvIiB8IGNyb250YWIgLQ0KL3NiaW4vY2hrY29uZmlnIGNyb25kIG9uDQo=', 'name': 'princeton_hello', 'encoding': 'base64'}]])
# Convert plc_initscript.initscript_id to raw initscript attribute
-for slice_attribute in GetSliceAttributes({'name': 'plc_initscript'}):
+for slice_attribute in GetSliceTags({'name': 'plc_initscript'}):
id = slice_attribute['slice_attribute_id']
slice_id = slice_attribute['slice_id']
initscript_id = int(slice_attribute['value'])
# Delete old attribute
- DeleteSliceAttribute(id)
+ DeleteSliceTag(id)
if initscript_id not in initscripts:
print "Warning: Missing initscript %d" % initscript_id
initscript = base64.b64decode(initscripts[initscript_id]['script'])
# Add as initscript attribute
- AddSliceAttribute(slice_id, 'initscript', initscript)
+ AddSliceTag(slice_id, 'initscript', initscript)
# Add our custom yum.conf entries
conf_file_id = AddConfFile({