class vimconnector(vimconn.vimconnector):
def __init__(self, uuid, name, tenant_id, tenant_name, url, url_admin=None, user=None, passwd=None, log_level=None,
- config={}):
+ config={}, persistent_info={}):
""" Params: uuid - id asigned to this VIM
name - name assigned to this VIM, can be used for logging
tenant_id - ID to be used for tenant
region_name - name of region to deploy the instances
vpc_cidr_block - default CIDR block for VPC
security_groups - default security group to specify this instance
+ persistent_info - dict where the class can store information that will be available among class
+ destroy/creation cycles. This info is unique per VIM/credential. At first call it will contain an
+ empty dict. Useful to store login/tokens information for speed up communication
"""
vimconn.vimconnector.__init__(self, uuid, name, tenant_id, tenant_name, url, url_admin, user, passwd, log_level,
- config)
+ config, persistent_info)
+
+ self.persistent_info = persistent_info
self.a_creds = {}
if user:
self.a_creds['aws_access_key_id'] = user
except IOError as e:
raise vimconn.vimconnException("Error reading file '{}': {}".format(flavor_data[1:], e))
elif isinstance(flavor_data, dict):
- self.flavor_data = flavor_data
+ self.flavor_info = flavor_data
self.logger = logging.getLogger('openmano.vim.aws')
if log_level:
if filter_dict != {}:
if 'tenant_id' in filter_dict:
tfilters['vpcId'] = filter_dict['tenant_id']
- subnets = self.conn_vpc.get_all_subnets(subnet_ids=filter_dict.get('id', None), filters=tfilters)
+ subnets = self.conn_vpc.get_all_subnets(subnet_ids=filter_dict.get('name', None), filters=tfilters)
net_list = []
for net in subnets:
net_list.append(
{'id': str(net.id), 'name': str(net.id), 'status': str(net.state), 'vpc_id': str(net.vpc_id),
- 'cidr_block': str(net.cidr_block)})
+ 'cidr_block': str(net.cidr_block), 'type': 'bridge'})
return net_list
except Exception as e:
self.format_vimconn_exception(e)
try:
flavor = None
for key, values in self.flavor_info.iteritems():
- if (values["memory"], values["cores"], values["disk"]) == (
- flavor_dict["ram"], flavor_dict["cpus"], flavor_dict["disk"]):
+ if (values["ram"], values["cpus"], values["disk"]) == (
+ flavor_dict["ram"], flavor_dict["vcpus"], flavor_dict["disk"]):
flavor = (key, values)
break
- elif (values["memory"], values["cores"], values["disk"]) >= (
- flavor_dict["ram"], flavor_dict["cpus"], flavor_dict["disk"]):
+ elif (values["ram"], values["cpus"], values["disk"]) >= (
+ flavor_dict["ram"], flavor_dict["vcpus"], flavor_dict["disk"]):
if not flavor:
flavor = (key, values)
else:
- if (flavor[1]["memory"], flavor[1]["cores"], flavor[1]["disk"]) >= (
- values["memory"], values["cores"], values["disk"]):
+ if (flavor[1]["ram"], flavor[1]["cpus"], flavor[1]["disk"]) >= (
+ values["ram"], values["cpus"], values["disk"]):
flavor = (key, values)
if flavor:
return flavor[0]
self.format_vimconn_exception(e)
def new_vminstance(self, name, description, start, image_id, flavor_id, net_list, cloud_config=None,
- disk_list=None):
+ disk_list=None, availability_zone_index=None, availability_zone_list=None):
"""Create a new VM/instance in AWS
Params: name
decription
try:
self._reload_connection()
instance = None
- userdata = None
- if isinstance(cloud_config, dict):
- if cloud_config.get("user-data"):
- userdata = cloud_config["user-data"]
- if cloud_config.get("config-files") or cloud_config.get("users") or cloud_config.get("key-pairs"):
- if userdata:
- raise vimconn.vimconnConflictException(
- "Cloud-config cannot contain both 'userdata' and 'config-files'/'users'/'key-pairs'")
- userdata_dict = {}
- # default user
- if cloud_config.get("key-pairs"):
- userdata_dict["ssh-authorized-keys"] = cloud_config["key-pairs"]
- userdata_dict["users"] = [{"default": None, "ssh-authorized-keys": cloud_config["key-pairs"]}]
- if cloud_config.get("users"):
- if "users" not in userdata_dict:
- userdata_dict["users"] = ["default"]
- for user in cloud_config["users"]:
- user_info = {
- "name": user["name"],
- "sudo": "ALL = (ALL)NOPASSWD:ALL"
- }
- if "user-info" in user:
- user_info["gecos"] = user["user-info"]
- if user.get("key-pairs"):
- user_info["ssh-authorized-keys"] = user["key-pairs"]
- userdata_dict["users"].append(user_info)
-
- if cloud_config.get("config-files"):
- userdata_dict["write_files"] = []
- for file in cloud_config["config-files"]:
- file_info = {
- "path": file["dest"],
- "content": file["content"]
- }
- if file.get("encoding"):
- file_info["encoding"] = file["encoding"]
- if file.get("permissions"):
- file_info["permissions"] = file["permissions"]
- if file.get("owner"):
- file_info["owner"] = file["owner"]
- userdata_dict["write_files"].append(file_info)
- userdata = "#cloud-config\n"
- userdata += yaml.safe_dump(userdata_dict, indent=4, default_flow_style=False)
- self.logger.debug("userdata: %s", userdata)
- elif isinstance(cloud_config, str):
- userdata = cloud_config
+ _, userdata = self._create_user_data(cloud_config)
if not net_list:
reservation = self.conn.run_instances(
interface_dict['vim_interface_id'] = interface.id
interface_dict['vim_net_id'] = interface.subnet_id
interface_dict['mac_address'] = interface.mac_address
- interface_dict['ip_address'] = interface.private_ip_address
+ if hasattr(interface, 'publicIp') and interface.publicIp != None:
+ interface_dict['ip_address'] = interface.publicIp + ";" + interface.private_ip_address
+ else:
+ interface_dict['ip_address'] = interface.private_ip_address
instance_dict['interfaces'].append(interface_dict)
except Exception as e:
self.logger.error("Exception getting vm status: %s", str(e), exc_info=True)