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
Beispiel #2
0
    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
Beispiel #6
0
    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 handle_service_type(self):
     return svc_info.get_lb_service_type()
Beispiel #10
0
    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
Beispiel #11
0
    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())