+
+
+ def run_instances(self, instance_name, tenant_name, rspec, key_name, pubkeys):
+ #logger.debug('Reserving an instance: image: %s, flavor: ' \
+ # '%s, key: %s, name: %s' % \
+ # (image_id, flavor_id, key_name, slicename))
+
+ # make sure a tenant exists for this slice
+ tenant = self.create_tenant(tenant_name)
+
+ # add the sfa admin user to this tenant and update our nova client connection
+ # to use these credentials for the rest of this session. This emsures that the instances
+ # we create will be assigned to the correct tenant.
+ sfa_admin_user = self.driver.shell.auth_manager.users.find(name=self.driver.shell.auth_manager.opts['OS_USERNAME'])
+ user_role = self.driver.shell.auth_manager.roles.find(name='user')
+ admin_role = self.driver.shell.auth_manager.roles.find(name='admin')
+ self.driver.shell.auth_manager.roles.add_user_role(sfa_admin_user, admin_role, tenant)
+ self.driver.shell.auth_manager.roles.add_user_role(sfa_admin_user, user_role, tenant)
+ self.driver.shell.nova_manager.connect(tenant=tenant.name)
+
+ authorized_keys = "\n".join(pubkeys)
+ files = {'/root/.ssh/authorized_keys': authorized_keys}
+ rspec = RSpec(rspec)
+ requested_instances = defaultdict(list)
+ # iterate over clouds/zones/nodes
+ for node in rspec.version.get_nodes_with_slivers():
+ instances = node.get('slivers', [])
+ if not instances:
+ continue
+ for instance in instances:
+ try:
+ metadata = {}
+ flavor_id = self.driver.shell.nova_manager.flavors.find(name=instance['name'])
+ image = instance.get('disk_image')
+ if image and isinstance(image, list):
+ image = image[0]
+ image_id = self.driver.shell.nova_manager.images.find(name=image['name'])
+ fw_rules = instance.get('fw_rules', [])
+ group_name = self.create_security_group(instance_name, fw_rules)
+ metadata['security_groups'] = group_name
+ if node.get('component_id'):
+ metadata['component_id'] = node['component_id']
+ self.driver.shell.nova_manager.servers.create(flavor=flavor_id,
+ image=image_id,
+ key_name = key_name,
+ security_groups = [group_name],
+ files=files,
+ meta=metadata,
+ name=instance_name)
+ except Exception, err:
+ logger.log_exc(err)
+
+
+
+ def delete_instances(self, instance_name, tenant_name):
+ self.driver.shell.nova_manager.connect(tenant=tenant_name)
+ instances = self.driver.shell.nova_manager.servers.findall(name=instance_name)
+ security_group_manager = SecurityGroup(self.driver)
+ for instance in instances:
+ # deleate this instance's security groups
+ security_group = instance.metadata.get('security_groups', '')
+ if security_group:
+ # dont delete the default security group
+ if security_group != 'default':
+ security_group_manager.delete_security_group(security_group)
+ # destroy instance
+ self.driver.shell.nova_manager.servers.delete(instance)
+ return 1
+
+ def stop_instances(self, instance_name, tenant_name):
+ self.driver.shell.nova_manager.connect(tenant=tenant_name)
+ instances = self.driver.shell.nova_manager.servers.findall(name=instance_name)
+ for instance in instances:
+ self.driver.shell.nova_manager.servers.pause(instance)
+ return 1
+
+ def update_instances(self, project_name):
+ pass