def check_service(self, si):
        if si.max_instances>len(si.port_tuples):
            return False

        pt_list = list(si.port_tuples)
        pi_list = []
        all_possible_pi=[]

        for pt_uuid in pt_list:
            pt_obj = PortTupleSM.get(pt_uuid)
            for vmi_uuid in pt_obj.virtual_machine_interfaces:
                vmi_obj = VirtualMachineInterfaceSM.get(vmi_uuid)
                pi_list.append(vmi_obj.physical_interface)

        st_obj = ServiceTemplateSM.get(si.service_template)
        if not st_obj.service_appliance_set:
            return False

        sa_set_obj = ServiceApplianceSetSM.get(st_obj.service_appliance_set)
        for sa_uuid in sa_set_obj.service_appliances:
            sa_obj = ServiceApplianceSM.get(sa_uuid)
            for key in sa_obj.physical_interfaces:
                all_possible_pi.append(sa_obj.physical_interfaces[key])

        if not pi_list and all_possible_pi and si.max_instances>0:
            return False

        if not all_possible_pi and pi_list:
            return False

        for pi_uuid in pi_list:
            if not pi_uuid in all_possible_pi:
                return False

        return True
    def check_service(self, si):
        if si.max_instances > len(si.port_tuples):
            return False

        pt_list = list(si.port_tuples)
        pi_list = []
        all_possible_pi = []

        for pt_uuid in pt_list:
            pt_obj = PortTupleSM.get(pt_uuid)
            for vmi_uuid in pt_obj.virtual_machine_interfaces:
                vmi_obj = VirtualMachineInterfaceSM.get(vmi_uuid)
                pi_list.append(vmi_obj.physical_interface)

        st_obj = ServiceTemplateSM.get(si.service_template)
        if not st_obj.service_appliance_set:
            return False

        sa_set_obj = ServiceApplianceSetSM.get(st_obj.service_appliance_set)
        for sa_uuid in sa_set_obj.service_appliances:
            sa_obj = ServiceApplianceSM.get(sa_uuid)
            for key in sa_obj.physical_interfaces:
                all_possible_pi.append(sa_obj.physical_interfaces[key])

        if not pi_list and all_possible_pi and si.max_instances > 0:
            return False

        if not all_possible_pi and pi_list:
            return False

        for pi_uuid in pi_list:
            if not pi_uuid in all_possible_pi:
                return False

        return True
    def create_service(self, st, si):
        if not self.validate_network_config(st, si):
            return
        # if service already inited do nothing
        if self.check_service(si):
            return

        # get service appliances from service template
        if not st.service_appliance_set:
            self.logger.error("Can't find service appliances set")
            return
        sa_set_obj = ServiceApplianceSetSM.get(st.service_appliance_set)
        sa_list = list(sa_set_obj.service_appliances)

        # validation
        if not sa_list:
            self.logger.error("Can't find service appliances")
            return

        #clean all existed staff before create new
        self.clean_service(si)
        # create a fake VM for the schmea transfer to use
        vm_list = [None] * si.max_instances

        # get the port-tuple
        pt_list = [None] * si.max_instances
        if si.max_instances > len(sa_list):
            self.logger.info("There are not enough Service appliance \
                    for that Service instance " + si.uuid)
            return
        for idx, sa_uuid in enumerate(sa_list):
            if idx > si.max_instances:
                return

            vm_uuid = vm_list[idx]
            if not vm_uuid:
                vm_uuid = str(uuid.uuid4())
            vm_obj = self.link_si_to_vm(si, st, idx, vm_uuid)

            pt_uuid = pt_list[idx]
            if not pt_uuid:
                pt_uuid = str(uuid.uuid4())
            pt_obj = self.create_port_tuple(si, st, idx, pt_uuid)

            instance_name = self._get_instance_name(si, idx)
            si.state = 'launching'
            sa = ServiceApplianceSM.get(sa_uuid)
            for nic in si.vn_info:
                pi_uuid = sa.physical_interfaces.get(nic['type'], None)
                pi_obj = PhysicalInterfaceSM.get(pi_uuid)
                if not pi_obj:
                    return
                vmi_obj = self._create_svc_vm_port(nic,
                                                   instance_name,
                                                   si,
                                                   st,
                                                   vm_obj=vm_obj,
                                                   pi=pi_obj,
                                                   pt=pt_obj)
        si.state = "active"
    def create_service(self, st, si):
        if not self.validate_network_config(st, si):
            return
        # if service already inited do nothing
        if self.check_service(si):
            return

        # get service appliances from service template
        if not st.service_appliance_set:
            self.logger.error("Can't find service appliances set")
            return
        sa_set_obj = ServiceApplianceSetSM.get(st.service_appliance_set)
        sa_list = list(sa_set_obj.service_appliances)

        # validation
        if not sa_list:
            self.logger.error("Can't find service appliances")
            return

        #clean all existed staff before create new
        self.clean_service(si)
        # create a fake VM for the schmea transfer to use
        vm_list = [None]*si.max_instances

        # get the port-tuple
        pt_list = [None]*si.max_instances
        if si.max_instances > len(sa_list):
            self.logger.info(
                "There are not enough Service appliance \
                    for that Service instance "+si.uuid)
            return
        for idx, sa_uuid in enumerate(sa_list):
            if idx > si.max_instances:
                return

            vm_uuid = vm_list[idx]
            if not vm_uuid:
                vm_uuid = str(uuid.uuid4())
            vm_obj = self.link_si_to_vm(si, st, idx, vm_uuid)

            pt_uuid = pt_list[idx]
            if not pt_uuid:
                pt_uuid = str(uuid.uuid4())
            pt_obj = self.create_port_tuple(si, st, idx, pt_uuid)

            instance_name = self._get_instance_name(si, idx)
            si.state = 'launching'
            sa = ServiceApplianceSM.get(sa_uuid)
            for nic in si.vn_info:
                pi_uuid = sa.physical_interfaces.get(nic['type'], None)
                pi_obj = PhysicalInterfaceSM.get(pi_uuid)
                if not pi_obj:
                    return
                vmi_obj = self._create_svc_vm_port(nic,
                                                   instance_name, si, st,
                                                   vm_obj=vm_obj,
                                                   pi=pi_obj,
                                                   pt=pt_obj)
        si.state = "active"
Exemplo n.º 5
0
    def create_service(self, st, si):
        if not self.validate_network_config(st, si):
            return
        # get service appliances from service template
        sa_set = st.service_appliance_set
        if not sa_set:
            self.logger.log_error("Can't find service appliances set")
            return
        service_appliance_set = ServiceApplianceSetSM.get(sa_set)
        service_appliances = service_appliance_set.service_appliances

        # validation
        if not service_appliances:
            self.logger.log_error("Can't find service appliances")
            return

        service_appliances = list(service_appliances)
        si_obj = ServiceInstanceSM.get(si.uuid)

        # create a fake VM for the schmea transfer to use
        vm_uuid_list = list(si_obj.virtual_machines)
        vm_list = [None] * si.max_instances
        for vm_uuid in vm_uuid_list:
            vm = VirtualMachineSM.get(vm_uuid)
            if not vm:
                continue
            if (vm.index + 1) > si.max_instances:
                self.delete_service(vm)
                continue
            vm_list[vm.index] = vm_uuid

        if si.max_instances > len(service_appliances):
            self.logger.log_info("There are not enough Service appliance \
                    for that Service instance " + si.uuid)
            return
        for idx, sa_uuid in enumerate(service_appliances):
            if idx > si.max_instances:
                return
            vm_uuid = vm_list[idx]
            if not vm_uuid:
                vm_uuid = str(uuid.uuid4())
            vm_obj = self.link_si_to_vm(si, st, idx, vm_uuid)
            instance_name = self._get_instance_name(si, idx)
            si.state = 'launching'
            sa = ServiceApplianceSM.get(sa_uuid)
            for nic in si.vn_info:
                pi_uuid = sa.physical_interfaces.get(nic['type'], None)
                pi_obj = PhysicalInterfaceSM.get(pi_uuid)
                if not pi_obj:
                    return
                vmi_obj = self._create_svc_vm_port(nic,
                                                   instance_name,
                                                   si,
                                                   st,
                                                   vm_obj=vm_obj,
                                                   pi=pi_obj,
                                                   instance_id=idx)
        si.state = "active"
    def create_service(self, st, si):
        if not self.validate_network_config(st, si):
            return
        # get service appliances from service template
        sa_set = st.service_appliance_set
        if not sa_set:
            self.logger.log_error("Can't find service appliances set")
            return
        service_appliance_set = ServiceApplianceSetSM.get(sa_set)
        service_appliances = service_appliance_set.service_appliances

        # validation
        if not service_appliances:
            self.logger.log_error("Can't find service appliances")
            return

        service_appliances = list(service_appliances)
        si_obj = ServiceInstanceSM.get(si.uuid)

        # create a fake VM for the schmea transfer to use
        vm_uuid_list = list(si_obj.virtual_machines)
        vm_list = [None]*si.max_instances
        for vm_uuid in vm_uuid_list:
            vm = VirtualMachineSM.get(vm_uuid)
            if not vm:
                continue
            if (vm.index + 1) > si.max_instances:
                self.delete_service(vm)
                continue
            vm_list[vm.index] = vm_uuid

        if si.max_instances > len(service_appliances):
            self.logger.log_info(
                "There are not enough Service appliance \
                    for that Service instance "+si.uuid)
            return
        for idx, sa_uuid in enumerate(service_appliances):
            if idx > si.max_instances:
                return
            vm_uuid = vm_list[idx]
            if not vm_uuid:
                vm_uuid = str(uuid.uuid4())
            vm_obj = self.link_si_to_vm(si, st, idx, vm_uuid)
            instance_name = self._get_instance_name(si, idx)
            si.state = 'launching'
            sa = ServiceApplianceSM.get(sa_uuid)
            for nic in si.vn_info:
                pi_uuid = sa.physical_interfaces.get(nic['type'],None)
                pi_obj = PhysicalInterfaceSM.get(pi_uuid)
                if not pi_obj:
                    return
                vmi_obj = self._create_svc_vm_port(nic,
                                                   instance_name, si, st,
                                                   vm_obj = vm_obj,
                                                   pi=pi_obj,
                                                   instance_id=idx)
        si.state = "active"
Exemplo n.º 7
0
    def create_service(self, st, si):
        if not self.validate_network_config(st, si):
            return
        #get service appliances from service template
        st_sets = list(st.service_appliance_sets)
        if not st_sets:
            self.logger.log_error("Can't find service appliances set")
            return
        service_appliance_set = ServiceApplianceSetSM.get(st_sets[0])
        service_appliances = service_appliance_set.service_appliances

        #validation
        if not service_appliances:
            self.logger.log_error("Can't find service appliances")
            return

        service_appliances = list(service_appliances)
        counter = 0

        si_obj = self._vnc_lib.service_instance_read(id=si.uuid)
        vmi_si_refs = si_obj.get_virtual_machine_interface_refs()
        vmi_si_set = set()
        si_vmi_added = False

        #create a fake VM for the schmea transfer to use
        vm_si_refs = si_obj.get_virtual_machine_back_refs()
        vm_id = ""
        if vm_si_refs and len(vm_si_refs)>0:
            vm_id = vm_si_refs[0]['uuid']
        else:
            vm_id = str(uuid.uuid4())
        self.link_si_to_vm(si, st, 0, vm_id)
        vm_obj =self._vnc_lib.virtual_machine_read(id=vm_id)

        if vmi_si_refs:
            for vmi_si_ref in vmi_si_refs:
                vmi_si_set.add(vmi_si_ref['uuid'])
        for idx in range(si.max_instances):
            instance_name = self._get_instance_name(si, idx)
            if idx+1 > len(service_appliances):
                sa_uuid = service_appliances[counter]
                counter = counter + 1
                if counter + 1 > len(service_appliances):
                    counter = 0
            else:
                sa_uuid = service_appliances[idx]

            si.state = 'launching'
            sa = ServiceApplianceSM.get(sa_uuid)
            #Create VMI
            ports = []
            for nic in si.vn_info:
                vmi_obj = self._create_svc_vm_port(nic, instance_name, si, st)
                if vmi_obj.uuid not in vmi_si_set:
                    vmi_si_obj = ServiceInstanceVirtualMachineInterfaceType()
                    int_uuid = str(si.uuid).replace("-","")
                    int_uuid = int(int_uuid,16)
                    vmi_si_obj.instance_id = int_uuid
                    vmi_si_obj.interface_type = nic['type']
                    si_obj.add_virtual_machine_interface(vmi_obj,vmi_si_obj)
                    si_vmi_added = True
                vmi_obj.add_virtual_machine(vm_obj)
                ports.append(vmi_obj)

            #connects the VMI with the PI
            pi_uuid_set = list(sa.physical_interfaces)
            for i in range(0,len(ports)):
                if i <= len(pi_uuid_set):
                    self._vnc_lib.ref_update('virtual-machine-interface', 
                        vmi.uuid, 'physical_interface_refs', pi_uuid_set[i], None, 'ADD')

        #fire change of the SI
        if si_vmi_added:
            self._vnc_lib.service_instance_update(si_obj)
            si_vmi_added = False
        si.state = "active"