diff --git a/common/connections.py b/common/connections.py index 443173a37..065f957fa 100755 --- a/common/connections.py +++ b/common/connections.py @@ -13,6 +13,7 @@ import os from openstack import OpenstackAuth, OpenstackOrchestrator from vcenter import VcenterAuth, VcenterOrchestrator +from vro import VroWorkflows from common.contrail_test_init import ContrailTestInit from vcenter_gateway import VcenterGatewayOrch try: @@ -80,6 +81,15 @@ def __init__(self, inputs=None, logger=None, project_name=None, self.nova_h = self.orch.get_compute_handler() self.quantum_h = self.orch.get_network_handler() self.glance_h = self.orch.get_image_handler() + elif self.inputs.orchestrator == 'vcenter' and self.inputs.slave_orchestrator == 'vro': + self.orch = VroWorkflows(user=self.inputs.vcenter_username, + pwd= self.inputs.vcenter_password, + host=self.inputs.vcenter_server, + port=self.inputs.vcenter_port, + dc_name=self.inputs.vcenter_dc, + vnc=self.vnc_lib, + inputs=self.inputs, + logger=self.logger) elif self.inputs.orchestrator == 'vcenter': # vcenter self.orch = VcenterOrchestrator(user=self.inputs.vcenter_username, pwd= self.inputs.vcenter_password, diff --git a/common/contrail_test_init.py b/common/contrail_test_init.py index 38a2c7b10..e500ba6e6 100755 --- a/common/contrail_test_init.py +++ b/common/contrail_test_init.py @@ -796,9 +796,10 @@ def parse_yml_file(self): self.config.get('orchestrator_configuration') or {} test_configs = self.config.get('test_configuration') or {} self.orchestrator = deployment_configs.get('orchestrator') or 'openstack' - self.slave_orchestrator = deployment_configs.get('slave_orchestrator') + self.slave_orchestrator = deployment_configs.get('slave_orchestrator',None) if self.deployer == 'openshift': kube_config_file = OPENSHIFT_CONFIG_FILE + else: kube_config_file = K8S_CONFIG_FILE self.kube_config_file = test_configs.get('kube_config_file') or kube_config_file @@ -954,6 +955,9 @@ def parse_yml_file(self): self.admin_password = self.vcenter_password self.admin_tenant = self.stack_tenant self.admin_domain = self.stack_domain + if self.slave_orchestrator == 'vro': + self.vro_ip = test_configs.get('vro_ip') + self.vro_port = test_configs.get('vro_port') def get_os_env(self, var, default=''): if var in os.environ: diff --git a/fixtures/policy_test.py b/fixtures/policy_test.py index 92050bcdf..117379e32 100644 --- a/fixtures/policy_test.py +++ b/fixtures/policy_test.py @@ -76,7 +76,10 @@ def setUp(self): try: self.policy_obj = self.vnc_lib.network_policy_read(fq_name=self.project_fq_name+[unicode(self.policy_name)]) except: - self.policy_fq_name = self._set_policy_api(self.policy_name, self.rules_list) + if self.inputs.slave_orchestrator == 'vro': + self.policy_fq_name = self._set_policy_vro(self.policy_name, self.rules_list) + else: + self.policy_fq_name = self._set_policy_api(self.policy_name, self.rules_list) else: self.already_present = True self.policy_fq_name=self.policy_obj.fq_name @@ -321,7 +324,16 @@ def serialize(obj): self.policy_obj = policy_rsp return policy_rsp # end _create_policy - + + def _set_policy_vro(self, policy_name, rules_list, policy_obj=None): + '''create policy and rules from vro''' + self.connections.orch.create_policy(name = policy_name, rules = rules_list) + self.policy_obj = self.vnc_lib.network_policy_read( + fq_name=self.project_fq_name+[unicode(self.policy_name)]) + self._populate_attr() + return self.policy_fq_name + #end _set_policy_vro + def _set_policy_api(self, policy_name, rules_list, policy_obj=None): ''' Create a policy from the supplied rules Sample rules_list: @@ -346,7 +358,7 @@ def _set_policy_api(self, policy_name, rules_list, policy_obj=None): 'dest_network' : vn1_name, 'dst_ports' : [100,10], } ] - ''' + ''' np_rules = [] for rule_dict in rules_list: source_vn = None @@ -537,9 +549,9 @@ def _set_policy_api(self, policy_name, rules_list, policy_obj=None): dst_ports=new_rule['dst_ports'], action_list=new_rule['action_list'])) - # end for self.logger.debug("Policy np_rules : %s" % (np_rules)) + pol_entries = PolicyEntriesType(np_rules) if policy_obj: policy_obj.network_policy_entries = pol_entries @@ -606,7 +618,10 @@ def get_entries(self): def _delete_policy(self): if self.api_flag: - self.vnc_lib.network_policy_delete(id=self.policy_obj.uuid) + if self.inputs.slave_orchestrator == 'vro': + self.connections.orch.delete_policy(self.policy_name) + else: + self.vnc_lib.network_policy_delete(id=self.policy_obj.uuid) self.logger.info("Deleted policy %s" % (self.policy_name)) elif self.inputs.is_gui_based_config(): self.webui.delete_policy(self) @@ -1119,6 +1134,7 @@ def verify_policy_in_api_server(self): logger=self.logger) if out: err_msg.append(out) + # compare policy_rules out = policy_test_utils.compare_args( 'policy_rules', self.api_s_policy_obj_x[ diff --git a/fixtures/security_group.py b/fixtures/security_group.py index 19f81c6c0..d54eddeb1 100644 --- a/fixtures/security_group.py +++ b/fixtures/security_group.py @@ -63,6 +63,9 @@ def create(self): self.already_present = False if self.inputs.is_gui_based_config(): self.webui.create_security_group(self) + elif self.inputs.slave_orchestrator == 'vro': + self.secgrp_id = self.orch.create_security_group(self.secgrp_name, + self.secgrp_entries) else: self.secgrp_id = self.orch.create_security_group( sg_name=self.secgrp_name, @@ -104,6 +107,8 @@ def delete(self, verify=False): if do_cleanup: if self.inputs.is_gui_based_config(): self.webui.delete_security_group(self) + elif self.inputs.slave_orchestrator == 'vro': + self.orch.delete_security_group(self.secgrp_name) else: self.orch.delete_security_group(sg_id=self.secgrp_id, option=self.option) if self.verify_is_run or verify: diff --git a/fixtures/svc_instance_fixture.py b/fixtures/svc_instance_fixture.py index 43b8719a4..df67af75d 100644 --- a/fixtures/svc_instance_fixture.py +++ b/fixtures/svc_instance_fixture.py @@ -32,6 +32,7 @@ def __init__(self, self.port_tuples_props = port_tuples_props self.connections = connections + self.orch = connections.orch self.vnc_lib = connections.vnc_lib self.api_s_inspect = connections.api_server_inspect self.nova_h = connections.nova_h @@ -115,6 +116,11 @@ def _create_si(self): "Service instance: %s already exists", self.si_fq_name) except NoIdError: self.logger.debug("Creating service instance: %s", self.si_fq_name) + if self.inputs.slave_orchestrator == 'vro': + self.orch.create_si(self.si_name, self.svc_template, self.if_details) + self.si_obj = self.vnc_lib.service_instance_read( + fq_name=self.si_fq_name) + self.orch.add_port_tuple(self.si_name, self.port_tuples_props) project = self.vnc_lib.project_read(fq_name=self.project_fq_name) svc_instance = ServiceInstance(self.si_name, parent_obj=project) si_type_args = None @@ -279,7 +285,10 @@ def _delete_si(self): for irt in intf_rt_table_list: self.disassociate_static_route_table(irt['uuid']) self.logger.debug("Deleting service instance: %s", self.si_fq_name) - self.vnc_lib.service_instance_delete(fq_name=self.si_fq_name) + if self.inputs.slave_orchestrator == 'vro': + self.orch.delete_si(self.si_name) + else: + self.vnc_lib.service_instance_delete(fq_name=self.si_fq_name) # end _delete_si @property diff --git a/fixtures/svc_template_fixture.py b/fixtures/svc_template_fixture.py index 5b40634d6..ace341e7d 100644 --- a/fixtures/svc_template_fixture.py +++ b/fixtures/svc_template_fixture.py @@ -88,45 +88,58 @@ def _create_st(self): self.logger.debug( "Service template: %s already exists", self.st_fq_name) except NoIdError: - domain = self.connections.vnc_lib_fixture.domain_read(fq_name=self.domain_fq_name) - svc_template = ServiceTemplate( - name=self.st_name, parent_obj=domain) - svc_properties = ServiceTemplateType() - svc_properties.set_service_type(self.service_type) - svc_properties.set_service_mode(self.service_mode) - svc_properties.set_version(self.version) - # Add flavor if not already added - if self.version == 1: - svc_properties.set_image_name(self.image_name) - svc_properties.set_service_scaling(self.svc_scaling) - self.orch.get_flavor(self.flavor) - svc_properties.set_flavor(self.flavor) - svc_properties.set_availability_zone_enable(self.availability_zone_enable) -# for itf in self.if_list: - for itf_type, val in self.if_details.iteritems(): - shared_ip = val.get('shared_ip_enable', None) - static_route_enable = val.get('static_route_enable', None) - if_type = ServiceTemplateInterfaceType( - service_interface_type=itf_type, - shared_ip=shared_ip, - static_route_enable=static_route_enable) - if_type.set_service_interface_type(itf_type) - svc_properties.add_interface_type(if_type) - - svc_template.set_service_template_properties(svc_properties) - if self.inputs.is_gui_based_config(): - self.webui.create_svc_template(self) - else: - self.uuid = self.vnc_lib_h.service_template_create(svc_template) - svc_template = self.vnc_lib_h.service_template_read( + if self.inputs.slave_orchestrator == 'vro': + st = {} + st['st_name'] = self.st_name + st['if_details'] = self.if_details + st['svc_mode'] = self.service_mode + st['svc_type'] = self.service_type + self.orch.create_st(st) + svc_template = self.vnc_lib_h.service_template_read( fq_name=self.st_fq_name) + else: + domain = self.connections.vnc_lib_fixture.domain_read(fq_name=self.domain_fq_name) + svc_template = ServiceTemplate( + name=self.st_name, parent_obj=domain) + svc_properties = ServiceTemplateType() + svc_properties.set_service_type(self.service_type) + svc_properties.set_service_mode(self.service_mode) + svc_properties.set_version(self.version) + # Add flavor if not already added + if self.version == 1: + svc_properties.set_image_name(self.image_name) + svc_properties.set_service_scaling(self.svc_scaling) + self.orch.get_flavor(self.flavor) + svc_properties.set_flavor(self.flavor) + svc_properties.set_availability_zone_enable(self.availability_zone_enable) + # for itf in self.if_list: + for itf_type, val in self.if_details.iteritems(): + shared_ip = val.get('shared_ip_enable', None) + static_route_enable = val.get('static_route_enable', None) + if_type = ServiceTemplateInterfaceType( + service_interface_type=itf_type, + shared_ip=shared_ip, + static_route_enable=static_route_enable) + if_type.set_service_interface_type(itf_type) + svc_properties.add_interface_type(if_type) + + svc_template.set_service_template_properties(svc_properties) + if self.inputs.is_gui_based_config(): + self.webui.create_svc_template(self) + else: + self.uuid = self.vnc_lib_h.service_template_create(svc_template) + svc_template = self.vnc_lib_h.service_template_read( + fq_name=self.st_fq_name) return svc_template # end _create_st def _delete_st(self): self.logger.debug("Deleting service template: %s", self.st_fq_name) - self.vnc_lib_h.service_template_delete(fq_name=self.st_fq_name) + if self.inputs.slave_orchestrator == 'vro': + self.orch.delete_st(self.st_name) + else: + self.vnc_lib_h.service_template_delete(fq_name=self.st_fq_name) # end _delete_st def verify_on_setup(self): diff --git a/fixtures/vn_test.py b/fixtures/vn_test.py index 4765f118f..8b0254c42 100644 --- a/fixtures/vn_test.py +++ b/fixtures/vn_test.py @@ -1451,7 +1451,9 @@ def get_obj(self): def bind_policies(self, policy_fq_names, vn_id=None, reset=True): vn_id = vn_id or self.uuid - if isinstance(self.orchestrator,VcenterOrchestrator) or self.option == 'contrail': + if self.inputs.slave_orchestrator == 'vro': + self.orch.add_network_policy_to_vn(self.vn_name, policy_fq_names) + elif isinstance(self.orchestrator,VcenterOrchestrator) or self.option == 'contrail': self.api_vn_obj = self.vnc_lib_h.virtual_network_read(id=self.uuid) if reset: self.api_vn_obj.set_network_policy_list([],True) @@ -1498,6 +1500,8 @@ def update_vn_object(self): def unbind_policies(self, vn_id=None, policy_fq_names=[]): vn_id = vn_id or self.uuid + if self.inputs.slave_orchestrator == 'vro': + self.orch.remove_network_policy_from_vn(self.vn_name, policy_fq_names) if isinstance(self.orchestrator,VcenterOrchestrator) or self.option == 'contrail': if policy_fq_names == []: self.api_vn_obj.set_network_policy_list([],True) diff --git a/fixtures/vro.py b/fixtures/vro.py new file mode 100644 index 000000000..4f2665099 --- /dev/null +++ b/fixtures/vro.py @@ -0,0 +1,507 @@ + +#from tcutils.vro_api_utils import VroUtilBase +from tcutils.vro.vro_inspect_utils import VroInspectUtils +from tcutils.vro.templates import WfTemplate +from vcenter import VcenterOrchestrator +from tcutils.util import * + +class VroWorkflows(VcenterOrchestrator): + def __init__(self, inputs, user, pwd, host, port, dc_name, vnc,logger=None): + super(VroWorkflows,self).__init__(user=user, + pwd= pwd, + host=host, + port=port, + dc_name=dc_name, + vnc=vnc, + inputs=inputs, + logger=logger) + self.inputs = inputs + self.ip = self.inputs.vro_ip + self.port = self.inputs.vro_port + self.vro_user_name = self.inputs.vcenter_username + self.vro_password = self.inputs.vcenter_password + self.wf_util = VroInspectUtils(self.ip, self.port, self.vro_user_name, self.vro_password ) + self.wf_template = WfTemplate() + self.status = None + self.output_params = None + self.header = None + self.connection = self._create_connection('vro',self.inputs.cfgm_ips[0]) + + def getName(self, name): + return self.wf_template.workflow_name_dict[name] + + def getOutputParams(self): + return self.output_params + + def get_post_body(self,wf_name, params=None): + return self.wf_template.workflow_name_template[wf_name](params) + + def get_work_flow_id(self, name): + return self.wf_util.get_wf_id(name) + + def execute(self, wf_id, payload=None): + header,output_params = self.wf_util.execute(wf_id,payload) + return header,output_params + + def get_wf_object_ids(self,name=None,parent_type = None): + return self.wf_util.get_parent(name,parent_type) + + def get_object_id(self, output, type=None): + object_id = output['value']['sdk-object']['id'] + object_id = id.split(',') + for id in object: + if type in id: + return id.split(':')[1] + + @retry(delay=3, tries=5) + def verify_wf_status(self, wf_name, obj_name, location): + wf_path = location + 'state' + result = self.wf_util.get_wf_status(wf_path) + if result != 'completed': + self.logger.info('%s Workflow %s status %s'%(wf_name,obj_name,result)) + return False + self.logger.info('%s Workflow %s status %s'%(wf_name,obj_name,result)) + return True + + #WORKFLOWS + + #Connection Workflows + + def _create_connection(self, name, controller, port='8082'): + conn_id = self.get_wf_object_ids(name,'Connection') + if conn_id: + return conn_id + wf_name = 'create_connection' + wf_id = self.get_work_flow_id(self.getName(wf_name)) + params = {'name': name, 'controller_ip': controller, 'port':port} + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(wf_name, name, header['location']) + return self.get_wf_object_ids(name,'Connection') + + def _delete_connection(self, conn_name='vro'): + wf_name = 'delete_connection' + wf_id = self.get_work_flow_id(self.getName(wf_name)) + conn_id = self.get_wf_object_ids(conn_name,'Connection') + params = {'Connection':conn_id} + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(wf_name,conn_name,header['location']) + + #Policy Workflows + def create_policy(self,name, rules, project='vCenter'): + wf_name = 'create_policy' + create_pol = {} + params = {'policy_name': name} + params['Project'] = self.get_wf_object_ids(project,'Project') + create_pol['wf_id'] = self.get_work_flow_id(self.getName(wf_name)) + create_pol['wf_name'] = wf_name + create_pol.update(params) + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(create_pol['wf_id'], payload) + assert self.verify_wf_status(wf_name,name,header['location']) + if rules: + self.add_policy_rules(create_pol,rules) + + def add_policy_rules(self,create_pol, rules): + wf_name = 'add_policy_rules' + wf_id = self.get_work_flow_id(self.getName(wf_name)) + pol_id = self.get_wf_object_ids(create_pol['policy_name'],'NetworkPolicy') + for rule in rules: + params = rule + params['NetworkPolicy'] = pol_id + if rule.get('source_network'): + network_id = self.get_wf_object_ids( + rule['source_network'],'VirtualNetwork') + params['source_network'] = network_id + params['src_address_type'] = 'Network' + if rule.get('dest_network'): + network_id = self.get_wf_object_ids( + rule['dest_network'],'VirtualNetwork') + params['dest_network'] = network_id + params['dest_address_type'] = 'Network' + if rule.get('src_ports'): + if type(rule['src_ports']) == list and len(rule['src_ports']) > 1: + params['src_ports'] = str(rule['src_ports'][0]) + '-' + str(rule['src_ports'][0]) + #else: + # params['src_ports'] = rule['src_ports'] + if rule.get('dst_ports'): + if type(rule['dst_ports']) == list and len(rule['dst_ports']) > 1: + params['dst_ports'] = str(rule['dst_ports'][0]) + '-' + str(rule['dst_ports'][0]) + #else: + # params['dst_ports'] = rule['dst_ports'] + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(wf_name, create_pol['policy_name'], header['location']) + + def delete_policy(self, name): + wf_name = 'delete_policy' + params = {} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + pol_id = self.get_wf_object_ids(name,'NetworkPolicy') + params['NetworkPolicy'] = pol_id + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(wf_name,name,header['location']) + + def remove_policy_rules(self): + pass + + #virtual_network_workflows + def add_network_policy_to_vn(self, vn_name, policy_names): + #need to handle if there are more than one policy + wf_name = 'add_policy_to_vn' + for policy in policy_names: + policy_name = policy.split(':')[-1] + params = {} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + vn_id = self.get_wf_object_ids(policy_name,'VirtualNetwork') + pol_id = self.get_wf_object_ids(vn_name,'NetworkPolicy') + params['VirtualNetwork'] = pol_id + params['NetworkPolicy'] = pol_id + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(wf_name,name,header['location']) + + def remove_network_policy_from_vn(self,vn_name, policy_names): + wf_name = 'remove_policy_from_vn' + for policy in policy_names: + policy_name = policy.split(':')[-1] + params = {} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + pol_id = self.get_wf_object_ids(name,'NetworkPolicy') + params['NetworkPolicy'] = pol_id + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(wf_name,name,header['location']) + + def edit_virtual_network(self): + pass + + #port workflows + def add_fip_to_port(self, port_uuid, fip_uuid): + add_fip_to_port = {} + wf_name = 'add_fip_to_port' + params = {} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + fip_id = self.get_wf_object_ids(fip,'FloatingIp') + port_id = self.get_wf_object_ids(port,'Port') + params['FloatingIp'] = fip_id + params['Port'] = port_id + add_fip_to_port = params + payload = self.get_post_body(wf_name, params) + header,output = self.execute(wf_id, payload) + assert self.verify_wf_status(wf_name, header['location']) + if output: + add_fip_to_port['output'] = output + + def remove_fip_from_port(self, port_uuid, fip_uuid): + remove_fip_from_port = {} + wf_name = 'remove_fip_from_port' + params = {} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + fip_id = self.get_wf_object_ids(fip,'FloatingIp') + port_id = self.get_wf_object_ids(port,'Port') + params['FloatingIp'] = fip_id + params['Port'] = port_id + remove_fip_to_port = params + payload = self.get_post_body(wf_name, params) + header,output = self.execute(wf_id, payload) + assert self.verify_wf_status(header['location']) + if output: + remove_fip_to_port['output'] = output + + def add_sg_to_port(self, port_uuid, sg): + wf_name = 'add_sg_to_port' + params = {} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + port_id = self.get_wf_object_ids(policy_name,'Port') + sg_id = self.get_wf_object_ids(vn_name,'SecurityGroup') + params['Port'] = port_id + params['SecurityGroup'] = sg_id + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(wf_name,name,header['location']) + + def remove_sg_from_port(self, port_uuid, sg): + wf_name = 'remove_sg_from_port' + params = {} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + port_id = self.get_wf_object_ids(policy_name,'Port') + sg_id = self.get_wf_object_ids(vn_name,'SecurityGroup') + params['Port'] = port_id + params['SecurityGroup'] = sg_id + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(wf_name,name,header['location']) + + #FIP workflows + def create_fip(self, pool_name, project='vCenter'): + wf_name = 'create_fip' + fip = {} + params = {} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + fip_pool_id = self.get_wf_object_ids(pool_name,'FloatingIpPool') + project_id = self.get_wf_object_ids(project,'Project') + params['FloatingIpPool'] = fip_pool_id + params['Project'] = project_id + fip = params + payload = self.get_post_body(wf_name, params) + header,output = self.execute(wf_id, payload) + assert self.verify_wf_status(header['location']) + if output: + fip_pool['output'] = output + + def delete_fip(self, fip_id): + wf_name = 'delete_fip' + fip = {} + params = {} + if not fip: + #fetch fip + pass + wf_id = self.get_work_flow_id(self.getName(wf_name)) + fip_id = self.get_wf_object_ids(fip_id,'FloatingIp') + params['FloatingIp'] = fip_id + fip = params + payload = self.get_post_body(wf_name, params) + header,output = self.execute(wf_id, payload) + assert self.verify_wf_status(header['location']) + if output: + fip_pool['output'] = output + pass + + #FIP_pool workflows + def create_fip_pool(self, pool_name, vn_name): + wf_name = 'create_fip_pool' + fip_pool = {} + params = {'fip_pool_name': pool_name} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + network_id = self.get_wf_object_ids(vn_name,'VirtualNetwork') + params['VirtualNetwork'] = network_id + fip_pool = params + payload = self.get_post_body(wf_name, params) + header,output = self.execute(wf_id, payload) + assert self.verify_wf_status(header['location']) + if output: + fip_pool['output'] = output + + def delete_fip_pool(self, pool_name): + wf_name = 'delete_fip_pool' + fip_pool = {} + params = {'fip_pool_name': pool_name} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + fip_pool_id = self.get_wf_object_ids(vn_name,'FloatingIpPool') + params['FloatingIpPool'] = fip_pool_id + fip_pool = params + payload = self.get_post_body(wf_name, params) + header,output = self.execute(wf_id, payload) + assert self.verify_wf_status(header['location']) + if output: + fip_pool['output'] = output + + def edit_fip_pool(self): + pass + + #Security_group Workflows + + def create_security_group(self, sg_name, rules, project='vCenter'): + wf_name = 'create_sg' + create_sg = {} + params = {'sg_name': name} + params['Project'] = self.get_wf_object_ids(project,'Project') + create_sg['wf_id'] = self.get_work_flow_id(self.getName(wf_name)) + create_sg['wf_name'] = wf_name + create_sg.update(params) + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(create_sg['wf_id'], payload) + assert self.verify_wf_status(header['location']) + if rules: + self.add_sg_rules(create_sg, rules) + if output_params: + sg_id = self.get_object_id(output_params, 'SecurityGroup') + + def edit_sg(self): + pass + + def add_rule_to_sg(self,create_sg, sg_rules): + #ether_type:{'IPv4','IPv6'} + #direction:{ingress,egress} + #address_type:{'CIDR','Security Group'} + #protocol{'icmp','tcp',etc} + #ports:{'any','range(10-20)' + #if ingress:_security + #src_add:cidr,securitygroup + #dst_add:local + #take src_ports + #if eggress: + #src_add:local + #dst_add:cidr,sg + #ports:dst_port + wf_name = 'add_sg_rules' + wf_id = self.get_work_flow_id(self.getName(wf_name)) + sg_id = self.get_wf_object_ids(create_sg['sg_name'],'SecurityGroup') + for rule in rules: + params = {} + params['protocol'] = rule['protocol'] + params['SecurityGroup'] = sg_id + if rule.get('security_group'): + params['security_group'] = self.get_wf_object_ids(rule['security_group'],'SecurityGroup') + if rule['src_addresses'][0].get('security_group') == 'local': + params['direction'] = 'egress' + if type(rule['src_ports']) == list and len(rule['src_ports']) > 1: + min = rule['dst_ports'][0]['start_port'] + max = rule['dst_ports'][0]['end_port'] + max = '65535' if max == -1 else max + params['ports'] = str(min) + '-' + str(max) + else: + params['direction'] = 'ingress' + if type(rule['dst_ports']) == list and len(rule['dst_ports']) > 1: + min = rule['dst_ports'][0]['start_port'] + max = rule['dst_ports'][0]['end_port'] + max = '65535' if max == -1 else max + params['ports'] = str(min) + '-' + str(max) + if params['direction'] == 'egress': + for addr in rule['dst_addresses']: + if addr.has_key('subnet') and addr['subnet'] != None: + params['addressType'] = 'CIDR' + params['address_cidr'] = addr['subnet']['ip_prefix'] + '/' + str(addr['subnet']['ip_prefix_len']) + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(header['location']) + #need to add addressType = SecurityGroup + else: + for addr in rule['src_addresses']: + if addr.has_key('subnet') and addr['subnet'] != None: + params['addressType'] = 'CIDR' + params['address_cidr'] = addr['subnet']['ip_prefix'] + '/' + str(addr['subnet']['ip_prefix_len']) + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(header['location']) + + def remove_rule_from_sg(self): + pass + + def delete_security_group(self, sg_name): + wf_name = 'delete_sg' + params = {} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + sg_id = self.get_wf_object_ids(sg_name,'SecurityGroup') + params['SecurityGroup'] = sg_id + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + self.verify_wf_status(header['location']) + + #Service Template workflows + def create_st(self, st): + #parent:Connection + #service_mode:{'transparent','in_network','in_network_nat'} + #service_type:{'firewall','analyzer'} + #virtualization_type:{'physical','virtual_machine'} + #vrouter_instance_type:{'livbirt-qemu','docker'} + wf_name = 'create_st' + create_st = {} + params = st + wf_id = self.get_work_flow_id(self.getName(wf_name)) + params['Connection'] = self.get_wf_object_ids(self.connection_name,'Connection') + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + self.verify_wf_status(header['location']) + + def delete_st(self, st_name): + wf_name = 'delete_st' + params = {} + wf_id = self.get_work_flow_id(self.getName(wf_name)) + st_id = self.get_wf_object_ids(st_name,'ServiceTemplate') + params['ServiceTemplate'] = st_id + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + self.verify_wf_status(header['location']) + + #Service Instance Workflows + + def create_si(self, si_name, st_name, if_details, project='vCenter'): + wf_name = 'create_si' + wf_id = self.get_work_flow_id(self.getName(wf_name)) + project_id = self.get_wf_object_ids(project,'Project') + st_id = self.get_wf_object_ids(st_name,'ServiceTemplate') + params['Project'] = project_id + params['ServiceTemplate'] = st_id + params['si_name'] = si_name + for itf in self.if_details: + virtual_network = None + if itf == 'left': + params['LeftVirtualNetwork'] = left_vn_name + elif itf == 'right': + params['RightVirtualNetwork'] = right_vn_name + elif itf == 'management': + params['MgmtVirtualNetwork'] = mgmt_vn_name + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(header['location']) + + def delete_si(self, si_name): + wf_name = 'delete_si' + wf_id = self.get_work_flow_id(self.getName(wf_name)) + si_id = self.get_wf_object_ids(si_name,'ServiceInstance') + params['ServiceInstance'] = si_id + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(header['location']) + + def add_port_tuple(self, si_name, pt_details): + wf_name = 'add_port_tuple' + wf_id = self.get_work_flow_id(self.getName(wf_name)) + si_id = self.get_wf_object_ids(si_name,'ServiceInstance') + params['pt_name'] = pt_details['name'] + params['ServiceInstance'] = si_id + for itf in self.if_details: + if itf == 'left': + params['LeftInterface'] = left_vn_name + elif itf == 'right': + params['RightInterface'] = right_vn_name + elif itf == 'management': + params['MgmtInterface'] = mgmt_vn_name + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(header['location']) + + def remove_port_tuple(self, si_name, pt_details): + wf_name = 'remove_port_tuple' + wf_id = self.get_work_flow_id(self.getName(wf_name)) + pt_id = self.get_wf_object_ids(pt_details['name'],'PortTuple') + si_id = self.get_wf_object_ids(si_name,'ServiceInstance') + params['PortTuple'] = pt_id + params['ServiceInstance'] = si_id + payload = self.get_post_body(wf_name, params) + header,output_params = self.execute(wf_id, payload) + assert self.verify_wf_status(header['location']) + +class Inputs(): + def __init__(self): + self.user = 'administrator@vsphere.local' + self.pwd = 'Contrail123!' + +def main(): + '''name = 'create_policy' + inputs = Inputs() + params = {'host_name':'nodec545454','host_ip':'nodec54','port':8082} + wf = WorkflowBase(inputs,'10.204.217.125', '8281', name, params)''' + #wf_name = 'create_policy' + wf_name = 'add_policy_rules' + inputs = Inputs() + #params[id]: Contrail:NetworkPolicy='Controller,NetworkPolicy:12eacd94-XX-XX, + #params['action'] + #params['protocol'] + #params['direction']='>,<>' + #params['src_address_type']='Network,cidr,policy' + #params = {'host_name':'nodec545454','host_ip':'nodec54','port':8082} + wf = WorkflowBase(inputs,'10.204.217.125', '8281', wf_name) + params = {'action':'pass','protocol':'any','direction':'>','src_address_type':'Network'} + params.update(wf.get_wf_object_ids('test_policy','NetworkPolicy')) + import pdb;pdb.set_trace() + wf.execute(params) +if __name__ == '__main__' : + main() + + + diff --git a/tcutils/vro/__init__.py b/tcutils/vro/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tcutils/vro/templates.py b/tcutils/vro/templates.py new file mode 100644 index 000000000..6d070a8d1 --- /dev/null +++ b/tcutils/vro/templates.py @@ -0,0 +1,540 @@ +class WfTemplate: + + def get_create_connection_template(params): + create_connection = {'parameters': [{'description': 'Connection name', + 'name': 'name', + 'type': 'string', + 'value': {'string': {'value': params['name']}}}, + {'description': 'Controller host', + 'name': 'host', + 'type': 'string', + 'value': {'string': {'value': params['controller_ip']}}}, + {'description': 'Controller port', + 'name': 'port', + 'type': 'number', + 'value': {'number': {'value': params['port']}}}, + ]} + return create_connection + + def get_delete_connection_template(params): + delete_connection = {'parameters': [{'scope': 'local', + 'type': 'Contrail:Connection', + 'name': 'item', + 'value': {'sdk-object': {'type': 'Contrail:Connection', + 'id': params['Connection']}}} + ]} + return delete_connection + + def get_create_policy_template(params): + #parent Contrail:Project ='api_123,Project:356f64e8-xx-xx' + create_policy = {'parameters': [{'name': 'name', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['policy_name']}}}, + {'name': 'parent', + 'scope': 'local', + 'type': 'Contrail:Project', + 'value': {'sdk-object': {'id': params['Project'], + 'type': 'Contrail:Project'}}}]} + return create_policy + + def get_delete_policy_template(params): + #parent 'Contrail:NetworkPolicy='api_123,NetworkPolicy:12eacd94-d63e + delete_policy = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:NetworkPolicy', + 'value': {'sdk-object': {'id': params['NetworkPolicy'], + 'type': 'Contrail:NetworkPolicy'}}}]} + return delete_policy + + def get_add_policy_rules_template(params): + #id: Contrail:NetworkPolicy='Controller,NetworkPolicy:12eacd94-XX-XX, + #'simple_action': pass,deny + #'protocol': + #'direction': '>,<>' + #'src_address_type']='Network,cidr,policy' + policy_rules = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:NetworkPolicy', + 'value': {'sdk-object': {'id':params['NetworkPolicy'], + 'type': 'Contrail:NetworkPolicy'}}}, + {'name': 'simpleAction', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['simple_action']}}}, + {'name': 'protocol', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['protocol']}}}, + {'name': 'direction', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['direction']}}}]} + if params.get('src_address_type') == 'Network': + policy_rules['parameters'].append({'name': 'srcAddressType', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': 'Network'}}}) + if params.get('source_network') == 'any': + policy_rules['parameters'].append({'name': 'srcVirtualNetworkType', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': 'any'}}}) + else: + policy_rules['parameters'].append({'name': 'srcVirtualNetworkType', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': 'reference'}}}) + policy_rules['parameters'].append({'name': 'srcVirtualNetwork', + 'scope': 'local', + 'type': 'Contrail:VirtualNetwork', + 'value': {'sdk-object': {'id':params['source_network'], + 'type': 'Contrail:VirtualNetwork'}}}) + if params.get('dest_address_type') == 'Network': + policy_rules['parameters'].append({'name': 'dstAddressType', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': 'Network'}}}) + if params.get('dest_network') == 'any': + policy_rules['parameters'].append({'name': 'dstVirtualNetworkType', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': 'any'}}}) + else: + policy_rules['parameters'].append({'name': 'dstVirtualNetworkType', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': 'reference'}}}) + policy_rules['parameters'].append({'name': 'dstVirtualNetwork', + 'scope': 'local', + 'type': 'Contrail:VirtualNetwork', + 'value': {'sdk-object': {'id':params['dest_network'], + 'type': 'Contrail:VirtualNetwork'}}}) + if params.get('src_ports'): + policy_rules['parameters'].append({'name': 'srcPorts', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['src_ports']}}}) + if params.get('dst_ports'): + policy_rules['parameters'].append({'name': 'dstPorts', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['dst_ports']}}}) + return policy_rules + + def get_remove_policy_rules_template(params): + pass + + #virtual_network + def get_add_network_policy_to_vn_template(self, params): + pol_to_vn = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:VirtualNetwork', + 'value': {'sdk-object': {'id': params['VirtualNetwork'], + 'type': 'Contrail:VirtualNetwork'}}}, + {'name': 'child', + 'scope': 'local', + 'type': 'Contrail:NetworkPolicy', + 'value': {'sdk-object': {'id': params['NetworkPolicy'], + 'type': 'Contrail:NetworkPolicy'}}}]} + return pol_to_vn + + def get_remove_network_policy_from_vn_template(self, params): + pol_from_vn = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:VirtualNetwork', + 'value': {'sdk-object': {'id': params['VirtualNetwork'], + 'type': 'Contrail:VirtualNetwork'}}}, + {'name': 'child', + 'scope': 'local', + 'type': 'Contrail:NetworkPolicy', + 'value': {'sdk-object': {'id': params['NetworkPolicy'], + 'type': 'Contrail:NetworkPolicy'}}}]} + return pol_from_vn + + def get_edit_vn_template(self): + pass + + #port + def get_add_fip_to_port_template(self, params): + fip_to_port = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:Port', + 'value': {'sdk-object': {'id': params['Port'], 'type': 'Contrail:Port'}}}, + {'name': 'child', + 'scope': 'local', + 'type': 'Contrail:FloatingIp', + 'value': {'sdk-object': {'id': params['FloatingIp'], + 'type': 'Contrail:FloatingIp'}}}, + {'name': 'fixedIpAddress', + 'scope': 'local', + 'type': 'boolean', + 'value': {'boolean': {'value': True}}}]} + return fip_to_port + + def get_remove_fip_from_port_template(self, params): + fip_to_port = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:Port', + 'value': {'sdk-object': {'id': params['Port'], 'type': 'Contrail:Port'}}}, + {'name': 'child', + 'scope': 'local', + 'type': 'Contrail:FloatingIp', + 'value': {'sdk-object': {'id': params['FloatingIp'], + 'type': 'Contrail:FloatingIp'}}}]} + return fip_to_port + + def get_add_sg_to_port_template(self, params): + sg_to_port = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:Port', + 'value': {'sdk-object': {'id': params['Port'], + 'type': 'Contrail:Port'}}}, + {'name': 'child', + 'scope': 'local', + 'type': 'Contrail:SecurityGroup', + 'value': {'sdk-object': {'id': params['SecurityGroup'], + 'type': 'Contrail:SecurityGroup'}}}]} + return sg_to_port + + def get_remove_sg_from_port_template(self, params): + sg_from_port = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:Port', + 'value': {'sdk-object': {'id': params['Port'], + 'type': 'Contrail:Port'}}}, + {'name': 'child', + 'scope': 'local', + 'type': 'Contrail:SecurityGroup', + 'value': {'sdk-object': {'id': params['SecurityGroup'], + 'type': 'Contrail:SecurityGroup'}}}]} + return sg_from_port + + #FIP + def get_create_fip_template(self, params): + fip = {'parameters': [{'name': 'parent', + 'scope': 'local', + 'type': 'Contrail:FloatingIpPool', + 'value': {'sdk-object': {'id': params['FloatingIpPool'], + 'type': 'Contrail:FloatingIpPool'}}}, + {'name': 'projects', + 'scope': 'local', + 'type': 'Array/Contrail:Project', + 'value': {'array': {'elements': [{'sdk-object': {'id': params['Project'], + 'type': 'Contrail:Project'}}]}}}, + {'name': 'address', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': ''}}}]} + + def get_delete_fip_template(self, params): + fip = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:FloatingIp', + 'value': {'sdk-object': {'id': params['FloatingIp'], + 'type': 'Contrail:FloatingIp'}}}]} + return fip + + #FIP_pool + def get_create_fip_pool_template(self, params): + fip_pool = {'parameters': [{'description': 'Connection name', + 'name': 'name', + 'type': 'string', + 'value': {'string': {'value': params['pool_name']}}}, + {'name': 'parent', + 'scope': 'local', + 'type': 'Contrail:Project', + 'value': {'sdk-object': {'id': params['VirtualNetwork'], + 'type': 'Contrail:VirtualNetwork'}}}]} + + def get_delete_fip_pool_template(self, params): + fip_pool = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:FloatingIpPool', + 'value': {'sdk-object': {'id': params['FolatingIpPool'], + 'type': 'Contrail:FloatingIpPool'}}}]} + return fip_pool + + def get_edit_fip_pool_template(self): + pass + + #Security_group + + def get_create_sg_template(self, params): + create_sg = {'parameters': [{'name': 'name', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['sg_name']}}}, + {'name': 'parent', + 'scope': 'local', + 'type': 'Contrail:Project', + 'value': {'sdk-object': {'id': params['Project'], + 'type': 'Contrail:Project'}}}]} + return create_sg + + def get_edit_sg_template(self): + pass + + def get_add_rule_to_sg_template(self): + #ether_type:{'IPv4','IPv6'} + #direction:{ingress,egress} + #address_type:{'CIDR','Security Group'} + #protocol{'icmp','tcp',etc} + #ports:{'any','range(10-20)' + sg_rules = {'parameters': [{'name': 'parent', + 'scope': 'local', + 'type': 'Contrail:SecurityGroup', + 'value': {'sdk-object': {'id': params['SecurityGroup'], + 'type': 'Contrail:SecurityGroup'}}}, + {'name': 'direction', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['direction']}}}, + {'name': 'ethertype', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': 'IPv4'}}}]} + if params.get('addressType') == 'CIDR': + sg_rules['parameters'].append({'name': 'addressType', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': 'CIDR'}}}, + {'name': 'addressCidr', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['address_cidr']}}}) + else: + sg_rules['parameters'].append({'name': 'addressType', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': 'Security Group'}}}, + {'name': 'addressSecurityGroup', + 'scope': 'local', + 'type': 'Contrail:SecurityGroup', + 'value': {'sdk-object': {'id':params['addressSecurityGroup'], + 'type': 'Contrail:SecurityGroup'}}}) + + sg_rules['parameters'].append({'name': 'protocol', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['protocol']}}}, + {'name': 'ports', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['ports']}}}) + return sg_rules + + def get_remove_rule_from_sg_template(self): + pass + + def get_delete_sg_template(self, params): + delete_sg = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:SecurityGroup', + 'value': {'sdk-object': {'id': params['SecurityGroup'], + 'type': 'Contrail:SecurityGroup'}}}]} + return delete_sg + + #Service Template + def get_create_st_template(self, params): + #parent:Connection + #service_mode:{'transparent','in_network','in_network_nat'} + #service_type:{'firewall','analyzer'} + #virtualization_type:{'physical','virtual_machine'} + #vrouter_instance_type:{'livbirt-qemu','docker'} + create_st = {'parameters': [{'name': 'parent', + 'scope': 'local', + 'type': 'Contrail:Connection', + 'value': {'sdk-object': {'id': params['Connection'], + 'type': 'Contrail:Connection'}}}, + {'name': 'name', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['st_name']}}}, + {'name': 'version', + 'scope': 'local', + 'type': 'number', + 'value': {'number': {'value': 2}}}, + {'name': 'serviceMode', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['svc_mode']}}}, + {'name': 'serviceType', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['svc_type']}}}, + {'name': 'serviceVirtualizationType', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': 'virtual-machine'}}}, + {'name': 'interfaceType', + 'scope': 'local', + 'type': 'Array/string', + 'value': {'array': {'elements': [{'string': {'value': 'management'}}, + {'string': {'value': 'left'}}, + {'string': {'value': 'right'}}]}}}]} + + return create_st + + def get_delete_st_template(self, params): + delete_st = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:ServiceTemplate', + 'value': {'sdk-object': {'id': params['ServiceTemplate'], + 'type': 'Contrail:ServiceTemplate'}}}]} + return delete_st + + #Service Instance + def get_create_si_template(self, params): + si = {'parameters': [{'name': 'parent', + 'scope': 'local', + 'type': 'Contrail:Project', + 'value': {'sdk-object': {'id': params['Project'], + 'type': 'Contrail:Project'}}}, + {'name': 'name', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['name']}}}, + {'name': 'serviceTemplate', + 'scope': 'local', + 'type': 'Contrail:ServiceTemplate', + 'value': {'sdk-object': {'id': params['ServiceTemplate'], + 'type': 'Contrail:ServiceTemplate'}}}, + {'name': 'virtualRouterId', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': ''}}}, + {'name': 'interface0', + 'scope': 'local', + 'type': 'Contrail:VirtualNetwork', + 'value': {'sdk-object': {'id': params['MgmtVirtualNetwork'], + 'type': 'Contrail:VirtualNetwork'}}}, + {'name': 'interface1', + 'scope': 'local', + 'type': 'Contrail:VirtualNetwork', + 'value': {'sdk-object': {'id': params['LeftVirtualnetwork'], + 'type': 'Contrail:VirtualNetwork'}}}, + {'name': 'interface2', + 'scope': 'local', + 'type': 'Contrail:VirtualNetwork', + 'value': {'sdk-object': {'id': params['RightVirtualNetwork'], + 'type': 'Contrail:VirtualNetwork'}}}]} + return si + + def get_delete_si_template(self, params): + si = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:ServiceTemplate', + 'value': {'sdk-object': {'id': params['ServiceTemplate'], + 'type': 'Contrail:ServiceTemplate'}}}]} + return si + + def get_add_port_tuple_template(self, params): + + port_tuple = {'parameters': [{'name': 'name', + 'scope': 'local', + 'type': 'string', + 'value': {'string': {'value': params['name']}}}, + {'name': 'parent', + 'scope': 'local', + 'type': 'Contrail:ServiceTemplate', + 'value': {'sdk-object': {'id': params['ServiceInstance'], + 'type': 'Contrail:SeriviceInstance'}}}, + {'name': 'port0', + 'scope': 'local', + 'type': 'Contrail:Port', + 'value': {'sdk-object': {'id': params['MgmtInterface'], + 'type': 'Contrail:Port'}}}, + {'name': 'port1', + 'scope': 'local', + 'type': 'Contrail:Port', + 'value': {'sdk-object': {'id': params['LeftInterface'], + 'type': 'Contrail:Port'}}}, + {'name': 'port2', + 'scope': 'local', + 'type': 'Contrail:Port', + 'value': {'sdk-object': {'id': params['RightInterface'], + 'type': 'Contrail:Port'}}}]} + + def get_remove_port_tuple_template(self, params): + port_tuple = {'parameters': [{'name': 'item', + 'scope': 'local', + 'type': 'Contrail:PortTuple', + 'value': {'sdk-object': {'id': params['PortTuple'], + 'type': 'Contrail:PortTuple'}}}, + {'name': 'parent', + 'scope': 'local', + 'type': 'Contrail:ServiceInstance', + 'value': {'sdk-object': {'id': params['ServiceInstance'], + 'type': 'Contrail:ServiceInstance'}}}]} + return port_tuple + + workflow_name_dict = { + 'create_connection' : 'Create Contrail controller connection', + 'delete_connection' : 'Delete Contrail controller connection', + 'create_poject' : 'Create Project', + 'create_vn' : 'Create virtual network', + 'create_policy': 'Create network policy', + 'add_policy_rules': 'Add rule to network policy', + 'remove_policy_rules': 'Remove network policy rule', + 'delete_policy': 'Delete Network policy', + 'add_policy_to_vn': 'Add network policy to virtual network', + 'remove_policy_from_vn': 'Remove network policy from virtual network', + 'edit_vn': 'Edit virtual network', + 'add_fip_to_port': 'Add floating IP to port', + 'remove_fip_from_port': 'Remove floating IP from port', + 'add_sg_to_port': 'Add security group to port', + 'remove_sg_from_port': 'Remove security from port', + 'create_fip': 'Create floating IP', + 'delete_fip': 'Delete floating IP', + 'create_fip_pool': 'Create floating IP pool', + 'delete_fip_pool': 'Delete floating IP pool', + 'edit_fip_pool': 'Delete floating IP pool', + 'create_sg': 'Create security group', + 'add_rule_to_sg': 'Add rule to security group', + 'remove_rule_from_sg': 'Remove security group rule', + 'delete_sg': 'Delete security group', + 'create_st': 'Create service template', + 'delete_st': 'Delete service template', + 'create_si': 'Delete service instance', + 'delete_si': 'Delete service instance', + 'add_port_tuple': 'Add port tuple to service instance', + 'remove_port_tuple': 'Remove port tuple from service instance' + } + + workflow_name_template = {'create_connection': get_create_connection_template, + 'delete_connection': get_delete_connection_template, + 'create_policy': get_create_policy_template, + 'add_policy_rules': get_add_policy_rules_template, + 'remove_policy_rules': get_remove_policy_rules_template, + 'delete_policy': get_delete_policy_template, + 'add_policy_to_vn': get_add_network_policy_to_vn_template, + 'remove_policy_from_vn': get_remove_network_policy_from_vn_template, + 'edit_vn': get_edit_vn_template, + 'add_fip_to_port': get_add_fip_to_port_template, + 'remove_fip_from_port': get_remove_fip_from_port_template, + 'add_sg_to_port': get_add_sg_to_port_template, + 'remove_sg_from_port': get_remove_sg_from_port_template, + 'create_fip': get_create_fip_template, + 'delete_fip': get_delete_fip_template, + 'create_fip_pool': get_create_fip_pool_template, + 'delete_fip_pool': get_delete_fip_pool_template, + 'edit_fip_pool': get_edit_fip_pool_template, + 'create_sg': get_create_sg_template, + 'add_rule_to_sg': get_add_rule_to_sg_template, + 'remove_rule_from_sg': get_remove_rule_from_sg_template, + 'delete_sg': get_delete_sg_template, + 'create_st': get_create_st_template, + 'delete_st': get_delete_st_template, + 'create_si': get_create_si_template, + 'delete_si': get_delete_si_template, + 'add_port_tuple': get_add_port_tuple_template, + 'remove_port_tuple': get_remove_port_tuple_template + } + + if __name__ == '__main__': + param_dict = {'wf_name':'create_connection','host_name':'c54','host_ip':'123','port':123} + temp = _workflow_name_template[param_dict['wf_name']](param_dict) + #temp = template(param_dict) + print temp + diff --git a/tcutils/vro/vro_api_utils.py b/tcutils/vro/vro_api_utils.py new file mode 100644 index 000000000..91f294bdc --- /dev/null +++ b/tcutils/vro/vro_api_utils.py @@ -0,0 +1,98 @@ +import requests, json +requests.packages.urllib3.disable_warnings() + +class AuthVRO(object): + def __init__(self,uname,passwd): + self.uname = uname + self.passwd = passwd + + def get_auth(self): + pass + +class SimpleAuthVRO(AuthVRO): + + def __init__(self,uname,passwd): + super(SimpleAuthVRO, self).__init__(uname,passwd) + + def get_auth(self): + auth = dict() + auth['simple_auth'] = (self.uname,self.passwd) + return auth + +class JsonDrv(object): + def __init__(self, uname, passd, auth_type = 'simple', verify=False): + #super(JsonDrv, self).__init__\ + # (self,name,template) + self._headers = {'Content-Type':'application/json','Accept':'application/json'} + self.uname = uname + self.passd = passd + self.auth_type = auth_type + self.verify = verify + self.auth = self._get_auth + + @property + def _get_auth(self): + if self.auth_type == 'simple': + return SimpleAuthVRO(self.uname,self.passd).get_auth() + else: + None + + def load(self, url): + if 'simple_auth' in self.auth: + response = requests.get(url, + headers=self._headers, + auth=self.auth['simple_auth'], + verify=self.verify) + if response.status_code == 200: + return json.loads(response.text) + return '' + + def put(self,url, payload): + if 'simple_auth' in self.auth: + data = json.dumps(payload) + response = requests.post(url, + headers=self._headers, + auth=self.auth['simple_auth'], + data=data, + verify=self.verify) + if response.status_code == 202: + output = '' + if response.text: + output = json.loads(response.text) + return response.headers,output + return '' +class VroUtilBase(object): + + def __init__(self, ip, port, uname, passd, api_string='/vco/api/', workflow=None, template=None, drv=JsonDrv): + self.uname = uname + self.passd = passd + self.ip = ip + self.port = port + self.api_string = api_string + self.base_url = self.get_base_url + self.drv = drv(uname, passd) + + @property + def get_base_url(self): + return 'https://' + self.ip + ':' + self.port + self.api_string + + def get_query_url(self, path='workflows', query_string = None): + #make query for catalog and workflows with query condition + self.query_string = query_string + condition = '/?conditions=name=' + self.query_string + return self.base_url + path + condition + + def get_execution_url(self, execution_id=None): + #make execution query + self.execution_string = 'workflows/' + execution_id + '/executions' + return self.base_url + self.execution_string + + def get_workflow_Staus(self): + status = self.drv.execute.status + return status + + def dict_get(self, url): + return self.drv.load(url) + + def put(self, url, payload): + return self.drv.put(url, payload) diff --git a/tcutils/vro/vro_inspect_utils.py b/tcutils/vro/vro_inspect_utils.py new file mode 100644 index 000000000..520f37034 --- /dev/null +++ b/tcutils/vro/vro_inspect_utils.py @@ -0,0 +1,46 @@ + +from tcutils.vro.vro_api_utils import VroUtilBase + +class VroInspectUtils(VroUtilBase): + + ''' pasrse vco inventory to veriy and get object realations''' + + def __init__(self, ip, port, user, passd, params=None): + super(VroInspectUtils,self).__init__(ip, port, user, passd) + #self.workflow = workflow + #self.params = params + + def get_parent(self, name, type=None): + return self.get_contrail_connection(name, type) + + def get_contrail_connection(self,name=None, type=None): + path = 'catalog/Contrail/' + type + url = self.get_query_url(path,name) + wf_details = self.dict_get(url) + return self.get_id(wf_details) + + def get_object_dunes_id(self, result): + pass + + def get_object_relation(self,object): + pass + + def get_wf_id(self, name): + query_url = self.get_query_url(query_string=name) + wf_details = self.dict_get(query_url) + return self.get_id(wf_details) + + def execute(self,wf_id, payload): + url = self.get_execution_url(wf_id) + return self.put(url, payload) + + def get_id(self,wf_details): + for i in wf_details['link'][0]['attributes']: + if 'id' in i.values() or 'dunesId' in i.values(): + name,value = i.values() + return value + return '' + + def get_wf_status(self,path=None): + result = self.dict_get(path) + return result['value'] \ No newline at end of file