def _get_nic_info(self, si_obj, si_props, st_props): si_if_list = si_props.get_interface_list() st_if_list = st_props.get_interface_type() # for lb relax the check because vip and pool could be in same net if (st_props.get_service_type() != svc_info.get_lb_service_type()) \ and si_if_list and (len(si_if_list) != len(st_if_list)): self.logger.log("Error: IF mismatch template %s instance %s" % (len(st_if_list), len(si_if_list))) return # check and create virtual networks nics = [] proj_fq_name = si_obj.get_parent_fq_name() proj_obj = self._vnc_lib.project_read(fq_name=proj_fq_name) for idx in range(0, len(st_if_list)): nic = {} st_if = st_if_list[idx] itf_type = st_if.service_interface_type # set vn id if si_if_list and st_props.get_ordered_interfaces(): try: si_if = si_if_list[idx] except IndexError: continue vn_fq_name_str = si_if.get_virtual_network() nic['static-routes'] = si_if.get_static_routes() else: funcname = "get_" + itf_type + "_virtual_network" func = getattr(si_props, funcname) vn_fq_name_str = func() if (itf_type == svc_info.get_left_if_str() and (st_props.get_service_type() == svc_info.get_snat_service_type())): vn_id = self._create_snat_vn(proj_obj, si_obj, si_props, vn_fq_name_str, idx) elif (itf_type == svc_info.get_right_if_str() and (st_props.get_service_type() == svc_info.get_lb_service_type())): iip_id, vn_id = self._get_vip_vmi_iip(si_obj) nic['iip-id'] = iip_id else: vn_id = self._get_vn_id(proj_obj, vn_fq_name_str, itf_type, si_obj) if vn_id is None: continue nic['net-id'] = vn_id nic['type'] = itf_type nic['shared-ip'] = st_if.shared_ip nic['static-route-enable'] = st_if.get_static_route_enable() nics.append(nic) return nics
def _get_nic_info(self, si_obj, si_props, st_props): si_if_list = si_props.get_interface_list() st_if_list = st_props.get_interface_type() # for lb relax the check because vip and pool could be in same net if (st_props.get_service_type() != svc_info.get_lb_service_type()) \ and si_if_list and (len(si_if_list) != len(st_if_list)): self.logger.log("Error: IF mismatch template %s instance %s" % (len(st_if_list), len(si_if_list))) return [] # check and create virtual networks nics = [] proj_fq_name = si_obj.get_parent_fq_name() proj_obj = self._vnc_lib.project_read(fq_name=proj_fq_name) for idx in range(0, len(st_if_list)): nic = {} st_if = st_if_list[idx] itf_type = st_if.service_interface_type # set vn id if si_if_list and st_props.get_ordered_interfaces(): try: si_if = si_if_list[idx] except IndexError: continue vn_fq_name_str = si_if.get_virtual_network() nic['static-routes'] = si_if.get_static_routes() else: funcname = "get_" + itf_type + "_virtual_network" func = getattr(si_props, funcname) vn_fq_name_str = func() if (itf_type == svc_info.get_left_if_str() and (st_props.get_service_type() == svc_info.get_snat_service_type())): vn_id = self._create_snat_vn(proj_obj, si_obj, si_props, vn_fq_name_str, idx) elif (itf_type == svc_info.get_right_if_str() and (st_props.get_service_type() == svc_info.get_lb_service_type())): iip_id, vn_id = self._get_vip_vmi_iip(si_obj) nic['iip-id'] = iip_id else: vn_id = self._get_vn_id(proj_obj, vn_fq_name_str, itf_type, si_obj) if vn_id is None: continue nic['net-id'] = vn_id nic['type'] = itf_type nic['shared-ip'] = st_if.shared_ip nic['static-route-enable'] = st_if.get_static_route_enable() nics.append(nic) return nics
def _check_store_si_info(self, st_obj, si_obj): config_complete = True st_props = st_obj.get_service_template_properties() st_if_list = st_props.get_interface_type() si_props = si_obj.get_service_instance_properties() si_if_list = si_props.get_interface_list() # for lb relax the check because vip and pool could be in same net if ( (st_props.get_service_type() != svc_info.get_lb_service_type()) and si_if_list and (len(si_if_list) != len(st_if_list)) ): self.logger.log("Error: IF mismatch template %s instance %s" % (len(st_if_list), len(si_if_list))) return # read existing si_entry si_entry = self.db.service_instance_get(si_obj.get_fq_name_str()) if not si_entry: si_entry = {} si_entry["instance_type"] = self._get_virtualization_type(st_props) si_entry["uuid"] = si_obj.uuid # walk the interface list for idx in range(0, len(st_if_list)): st_if = st_if_list[idx] itf_type = st_if.service_interface_type si_if = None if si_if_list and st_props.get_ordered_interfaces(): try: si_if = si_if_list[idx] except IndexError: continue si_vn_str = si_if.get_virtual_network() else: funcname = "get_" + itf_type + "_virtual_network" func = getattr(si_props, funcname) si_vn_str = func() if not si_vn_str: continue si_entry[itf_type + "-vn"] = si_vn_str try: vn_obj = self._vnc_lib.virtual_network_read(fq_name_str=si_vn_str) if vn_obj.uuid != si_entry.get(si_vn_str, None): si_entry[si_vn_str] = vn_obj.uuid except NoIdError: self.logger.log("Warn: VN %s add is pending" % si_vn_str) si_entry[si_vn_str] = "pending" config_complete = False if config_complete: self.logger.log("SI %s info is complete" % si_obj.get_fq_name_str()) else: self.logger.log("Warn: SI %s info is not complete" % si_obj.get_fq_name_str()) # insert entry self.db.service_instance_insert(si_obj.get_fq_name_str(), si_entry) return config_complete
def validate_network_config(self, st, si): if not si.params.get("interface_list"): self._upgrade_config(st, si) st_if_list = st.params.get("interface_type", []) si_if_list = si.params.get("interface_list", []) if not (len(st_if_list) or len(si_if_list)): self.logger.log_notice("Interface list empty for ST %s SI %s" % (st.fq_name, si.fq_name)) return False si.vn_info = [] config_complete = True for index in range(0, len(st_if_list)): vn_id = None try: si_if = si_if_list[index] st_if = st_if_list[index] except IndexError: continue nic = {} user_visible = True itf_type = st_if.get("service_interface_type") vn_fq_str = si_if.get("virtual_network", None) if itf_type == svc_info.get_left_if_str() and ( st.params.get("service_type") == svc_info.get_snat_service_type() ): vn_id = self._create_snat_vn(si, vn_fq_str, index) user_visible = False elif itf_type == svc_info.get_right_if_str() and ( st.params.get("service_type") == svc_info.get_lb_service_type() ): iip_id, vn_id = self._get_vip_vmi_iip(si) nic["iip-id"] = iip_id user_visible = False elif not vn_fq_str or vn_fq_str == "": vn_id = self._check_create_service_vn(itf_type, si) else: try: vn_id = self._vnc_lib.fq_name_to_id("virtual-network", vn_fq_str.split(":")) except NoIdError: config_complete = False nic["type"] = st_if.get("service_interface_type") nic["index"] = str(index + 1) nic["net-id"] = vn_id nic["shared-ip"] = st_if.get("shared_ip") nic["static-route-enable"] = st_if.get("static_route_enable") nic["static-routes"] = si_if.get("static_routes") nic["user-visible"] = user_visible si.vn_info.insert(index, nic) if config_complete: self.logger.log_info("SI %s info is complete" % si.fq_name) si.state = "config_complete" else: self.logger.log_warning("SI %s info is not complete" % si.fq_name) si.state = "config_pending" return config_complete
def validate_network_config(self, st, si): config_complete = True st_if_list = st.params.get('interface_type') si_if_list = si.params.get('interface_list') si.vn_info = [] for index in range(0, len(st_if_list)): vn_id = None try: si_if = si_if_list[index] st_if = st_if_list[index] except IndexError: continue nic = {} user_visible = True itf_type = st_if.get('service_interface_type') vn_fq_str = si_if.get('virtual_network', None) if (itf_type == svc_info.get_left_if_str() and (st.params.get('service_type') == svc_info.get_snat_service_type())): vn_id = self._create_snat_vn(si, vn_fq_str, index) user_visible = False elif (itf_type == svc_info.get_right_if_str() and (st.params.get('service_type') == svc_info.get_lb_service_type())): iip_id, vn_id = self._get_vip_vmi_iip(si) nic['iip-id'] = iip_id user_visible = False elif not vn_fq_str or vn_fq_str == '': vn_id = self._check_create_service_vn(itf_type, si) else: try: vn_id = self._vnc_lib.fq_name_to_id( 'virtual-network', vn_fq_str.split(':')) except NoIdError: config_complete = False nic['type'] = st_if.get('service_interface_type') nic['index'] = str(index + 1) nic['net-id'] = vn_id nic['shared-ip'] = st_if.get('shared_ip') nic['static-route-enable'] = st_if.get('static_route_enable') nic['static-routes'] = si_if.get('static_routes') nic['user-visible'] = user_visible si.vn_info.insert(index, nic) if config_complete: self.logger.log_info("SI %s info is complete" % si.fq_name) si.state = 'config_complete' else: self.logger.log_warn("SI %s info is not complete" % si.fq_name) si.state = 'config_pending' return config_complete
def create_service(self, st_obj, si_obj): si_props = si_obj.get_service_instance_properties() st_props = st_obj.get_service_template_properties() if st_props is None: self.logger.log("Cannot find service template associated to " "service instance %s" % si_obj.get_fq_name_str()) return # populate nic information nics = self._get_nic_info(si_obj, si_props, st_props) # set max instances local_prefs = None max_instances = 1 if si_props.get_ha_mode() == 'active-standby': max_instances = 2 local_prefs = self._get_local_prefs(si_obj, max_instances) elif si_props.get_scale_out(): max_instances = si_props.get_scale_out().get_max_instances() self.db.service_instance_insert(si_obj.get_fq_name_str(), {'max-instances': str(max_instances)}) # Create virtual machines, associate them to the service instance and # schedule them to different virtual routers instances = [] for inst_count in range(0, max_instances): # Create a virtual machine instance_name = self._get_instance_name(si_obj, inst_count) try: vm_obj = self._vnc_lib.virtual_machine_read(fq_name=[instance_name]) self.logger.log("Info: VM %s already exists" % (instance_name)) except NoIdError: vm_obj = VirtualMachine(instance_name) self._vnc_lib.virtual_machine_create(vm_obj) self.logger.log("Info: VM %s created" % (instance_name)) si_refs = vm_obj.get_service_instance_refs() if (si_refs is None) or (si_refs[0]['to'][0] == 'ERROR'): vm_obj.set_service_instance(si_obj) self._vnc_lib.virtual_machine_update(vm_obj) self.logger.log("Info: VM %s updated with SI %s" % (instance_name, si_obj.get_fq_name_str())) # Create virtual machine interfaces with an IP on networks local_preference = None if local_prefs: local_preference = local_prefs[inst_count] for nic in nics: user_visible = True if (st_props.get_service_type() == svc_info.get_lb_service_type()): if nic['type'] == svc_info.get_right_if_str(): user_visible = False else: user_visible = False vmi_obj = self._create_svc_vm_port(nic, instance_name, st_obj, si_obj, int(local_preference), user_visible) if vmi_obj.get_virtual_machine_refs() is None: vmi_obj.set_virtual_machine(vm_obj) self._vnc_lib.virtual_machine_interface_update(vmi_obj) self.logger.log("Info: VMI %s updated with VM %s" % (vmi_obj.get_fq_name_str(), instance_name)) # Associate instance on the scheduled vrouter chosen_vr_fq_name = None vrouter_name = None state = 'pending' vrouter_back_refs = vm_obj.get_virtual_router_back_refs() if vrouter_back_refs is None: chosen_vr_fq_name = self.vrouter_scheduler.schedule( si_obj.uuid, vm_obj.uuid) if chosen_vr_fq_name: vrouter_name = chosen_vr_fq_name[-1] state = 'active' self.logger.log("Info: VRouter %s updated with VM %s" % (':'.join(chosen_vr_fq_name), instance_name)) else: vrouter_name = vrouter_back_refs[0]['to'][-1] state = 'active' vm_db_entry = self._set_vm_db_info(inst_count, instance_name, vm_obj.uuid, state, vrouter_name, local_preference) self.db.service_instance_insert(si_obj.get_fq_name_str(), vm_db_entry) if int(local_preference) == svc_info.get_standby_preference(): ha = ("standby: %s" % (local_preference)) else: ha = ("active: %s" % (local_preference)) instances.append({'uuid': vm_obj.uuid, 'vr_name': vrouter_name, 'ha': ha}) # uve trace self.logger.uve_svc_instance(si_obj.get_fq_name_str(), status='CREATE', vms=instances, st_name=st_obj.get_fq_name_str())
def handle_service_type(self): return svc_info.get_lb_service_type()
def _check_store_si_info(self, st_obj, si_obj): config_complete = True st_props = st_obj.get_service_template_properties() st_if_list = st_props.get_interface_type() si_props = si_obj.get_service_instance_properties() si_if_list = si_props.get_interface_list() # for lb relax the check because vip and pool could be in same net if (st_props.get_service_type() != svc_info.get_lb_service_type()) \ and si_if_list and (len(si_if_list) != len(st_if_list)): self.logger.log("Error: IF mismatch template %s instance %s" % (len(st_if_list), len(si_if_list))) return # read existing si_entry si_entry = self.db.service_instance_get(si_obj.get_fq_name_str()) if not si_entry: si_entry = {} si_entry['instance_type'] = self._get_virtualization_type(st_props) si_entry['uuid'] = si_obj.uuid # walk the interface list for idx in range(0, len(st_if_list)): st_if = st_if_list[idx] itf_type = st_if.service_interface_type si_if = None if si_if_list and st_props.get_ordered_interfaces(): try: si_if = si_if_list[idx] except IndexError: continue si_vn_str = si_if.get_virtual_network() else: funcname = "get_" + itf_type + "_virtual_network" func = getattr(si_props, funcname) si_vn_str = func() if not si_vn_str: continue si_entry[itf_type + '-vn'] = si_vn_str try: vn_obj = self._vnc_lib.virtual_network_read( fq_name_str=si_vn_str) if vn_obj.uuid != si_entry.get(si_vn_str, None): si_entry[si_vn_str] = vn_obj.uuid except NoIdError: self.logger.log("Warn: VN %s add is pending" % si_vn_str) si_entry[si_vn_str] = 'pending' config_complete = False if config_complete: self.logger.log("SI %s info is complete" % si_obj.get_fq_name_str()) si_entry['state'] = 'config_complete' else: self.logger.log("Warn: SI %s info is not complete" % si_obj.get_fq_name_str()) si_entry['state'] = 'pending_config' #insert entry self.db.service_instance_insert(si_obj.get_fq_name_str(), si_entry) return config_complete
def create_service(self, st_obj, si_obj): si_props = si_obj.get_service_instance_properties() st_props = st_obj.get_service_template_properties() if st_props is None: self.logger.log("Cannot find service template associated to " "service instance %s" % si_obj.get_fq_name_str()) return # populate nic information nics = self._get_nic_info(si_obj, si_props, st_props) # set max instances local_prefs = None max_instances = 1 if si_props.get_ha_mode() == 'active-standby': max_instances = 2 local_prefs = self._get_local_prefs(si_obj, max_instances) elif si_props.get_scale_out(): max_instances = si_props.get_scale_out().get_max_instances() self.db.service_instance_insert(si_obj.get_fq_name_str(), {'max-instances': str(max_instances)}) # Create virtual machines, associate them to the service instance and # schedule them to different virtual routers instances = [] for inst_count in range(0, max_instances): # Create a virtual machine instance_name = self._get_instance_name(si_obj, inst_count) try: vm_obj = self._vnc_lib.virtual_machine_read( fq_name=[instance_name]) self.logger.log("Info: VM %s already exists" % (instance_name)) except NoIdError: vm_obj = VirtualMachine(instance_name) self._vnc_lib.virtual_machine_create(vm_obj) self.logger.log("Info: VM %s created" % (instance_name)) si_refs = vm_obj.get_service_instance_refs() if (si_refs is None) or (si_refs[0]['to'][0] == 'ERROR'): vm_obj.set_service_instance(si_obj) self._vnc_lib.virtual_machine_update(vm_obj) self.logger.log("Info: VM %s updated with SI %s" % (instance_name, si_obj.get_fq_name_str())) # Create virtual machine interfaces with an IP on networks local_preference = None if local_prefs: local_preference = local_prefs[inst_count] for nic in nics: user_visible = True if (st_props.get_service_type() == svc_info.get_lb_service_type()): if nic['type'] == svc_info.get_right_if_str(): user_visible = False else: user_visible = False vmi_obj = self._create_svc_vm_port( nic, instance_name, st_obj, si_obj, local_preference=int(local_preference), user_visible=user_visible, ha_mode=si_props.get_ha_mode()) if vmi_obj.get_virtual_machine_refs() is None: vmi_obj.set_virtual_machine(vm_obj) self._vnc_lib.virtual_machine_interface_update(vmi_obj) self.logger.log("Info: VMI %s updated with VM %s" % (vmi_obj.get_fq_name_str(), instance_name)) # Associate instance on the scheduled vrouter chosen_vr_fq_name = None vrouter_name = None state = 'pending' vrouter_back_refs = vm_obj.get_virtual_router_back_refs() if vrouter_back_refs is None: chosen_vr_fq_name = self.vrouter_scheduler.schedule( si_obj.uuid, vm_obj.uuid) if chosen_vr_fq_name: vrouter_name = chosen_vr_fq_name[-1] state = 'active' self.logger.log( "Info: VRouter %s updated with VM %s" % (':'.join(chosen_vr_fq_name), instance_name)) else: vrouter_name = vrouter_back_refs[0]['to'][-1] state = 'active' vm_db_entry = self._set_vm_db_info(inst_count, instance_name, vm_obj.uuid, state, vrouter_name, local_preference) self.db.service_instance_insert(si_obj.get_fq_name_str(), vm_db_entry) if int(local_preference) == svc_info.get_standby_preference(): ha = ("standby: %s" % (local_preference)) else: ha = ("active: %s" % (local_preference)) instances.append({ 'uuid': vm_obj.uuid, 'vr_name': vrouter_name, 'ha': ha }) # uve trace self.logger.uve_svc_instance(si_obj.get_fq_name_str(), status='CREATE', vms=instances, st_name=st_obj.get_fq_name_str())