def destroy(self):
        netns_name = validate_uuid(self.args.vm_id)
        nic_left = {}
        if uuid.UUID(self.args.vmi_left_id).int:
            nic_left = {'uuid': validate_uuid(self.args.vmi_left_id)}
        nic_right = {}
        if uuid.UUID(self.args.vmi_right_id).int:
            nic_right = {'uuid': validate_uuid(self.args.vmi_right_id)}

        netns_mgr = NetnsManager(netns_name,
                                 nic_left,
                                 nic_right,
                                 root_helper=self.args.root_helper,
                                 cfg_file=self.args.cfg_file,
                                 gw_ip=None,
                                 pool_id=self.args.pool_id,
                                 loadbalancer_id=self.args.loadbalancer_id)

        netns_mgr.unplug_namespace_interface()
        if self.args.service_type == self.SOURCE_NAT:
            netns_mgr.destroy()
        elif self.args.service_type == self.LOAD_BALANCER:
            netns_mgr.release_lbaas('destroy')
            netns_mgr.destroy()
        else:
            msg = ('The %s service type is not supported' %
                   self.args.service_type)
            raise NotImplementedError(msg)
 def _create_nic_def(vmi_id, vmi_mac=None, vmi_ip=None):
     nic = {}
     if uuid.UUID(vmi_id).int:
         nic['uuid'] = validate_uuid(vmi_id)
         if vmi_mac:
             nic['mac'] = netaddr.EUI(vmi_mac, dialect=netaddr.mac_unix)
         else:
             nic['mac'] = None
         if vmi_ip:
             nic['ip'] = netaddr.IPNetwork(vmi_ip)
         else:
             nic['ip'] = None
     return nic
Пример #3
0
 def _create_nic_def(vmi_id, vmi_mac=None, vmi_ip=None):
     nic = {}
     if uuid.UUID(vmi_id).int:
         nic['uuid'] = validate_uuid(vmi_id)
         if vmi_mac:
             nic['mac'] = netaddr.EUI(vmi_mac, dialect=netaddr.mac_unix)
         else:
             nic['mac'] = None
         if vmi_ip:
             nic['ip'] = netaddr.IPNetwork(vmi_ip)
         else:
             nic['ip'] = None
     return nic
Пример #4
0
    def destroy(self):
        """Destroys a SNAT VM"""
        vm_id = validate_uuid(self.args.vm_id)

        nic_left = None
        if uuid.UUID(self.args.vmi_left_id):
            nic_left = VMPort(uuid=self.args.vmi_left_id,
                              prefix=LEFT_DEV_PREFIX)

        nic_right = None
        if uuid.UUID(self.args.vmi_right_id):
            nic_right = VMPort(uuid=self.args.vmi_right_id,
                               prefix=RIGHT_DEV_PREFIX)

        snat_vm = SNATVirtualMachine(vm_id, nic_left, nic_right,
                                     vhd_path=self.args.vhd_path)
        try:
            snat_vm.unregister()
        finally:
            snat_vm.cleanup()
Пример #5
0
    def __init__(self, uuid, prefix, mac=None, ip_cidr=None, gw_cidr=None):
        self.uuid = validate_uuid(uuid)
        if mac:
            self.mac = netaddr.EUI(mac, dialect=netaddr.mac_eui48)
        if ip_cidr:
            self.ip = netaddr.IPNetwork(ip_cidr)
        if gw_cidr:
            self.gw_cidr = gw_cidr

        if prefix == LEFT_DEV_PREFIX:
            dev_suffix = "1"    # as seen from inside the SNAT VM
            win_prefix = "int"  # as seen from the host
        elif prefix == RIGHT_DEV_PREFIX:
            dev_suffix = "2"
            win_prefix = "gw"
        else:
            raise RuntimeError("prefix must be {} or {}"
                               .format(LEFT_DEV_PREFIX, RIGHT_DEV_PREFIX))
        self.name = self.DEV_PREFIX + dev_suffix
        self.win_name = "{}-{}".format(win_prefix, self.uuid)[:self.NAME_LEN]
    def __init__(self, uuid, prefix, mac=None, ip_cidr=None, gw_cidr=None):
        self.uuid = validate_uuid(uuid)
        if mac:
            self.mac = netaddr.EUI(mac, dialect=netaddr.mac_eui48)
        if ip_cidr:
            self.ip = netaddr.IPNetwork(ip_cidr)
        if gw_cidr:
            self.gw_cidr = gw_cidr

        if prefix == LEFT_DEV_PREFIX:
            dev_suffix = "1"  # as seen from inside the SNAT VM
            win_prefix = "int"  # as seen from the host
        elif prefix == RIGHT_DEV_PREFIX:
            dev_suffix = "2"
            win_prefix = "gw"
        else:
            raise RuntimeError("prefix must be {} or {}".format(
                LEFT_DEV_PREFIX, RIGHT_DEV_PREFIX))
        self.name = self.DEV_PREFIX + dev_suffix
        self.win_name = "{}-{}".format(win_prefix, self.uuid)[:self.NAME_LEN]
    def create(self):
        """Creates and configures a SNAT VM"""
        vm_id = validate_uuid(self.args.vm_id)

        nic_left = None
        if uuid.UUID(self.args.vmi_left_id):
            nic_left = VMPort(uuid=self.args.vmi_left_id,
                              prefix=LEFT_DEV_PREFIX,
                              mac=self.args.vmi_left_mac,
                              ip_cidr=self.args.vmi_left_ip,
                              gw_cidr=self.args.left_gw_cidr)

        nic_right = None
        if uuid.UUID(self.args.vmi_right_id):
            nic_right = VMPort(uuid=self.args.vmi_right_id,
                               prefix=RIGHT_DEV_PREFIX,
                               mac=self.args.vmi_right_mac,
                               ip_cidr=self.args.vmi_right_ip,
                               gw_cidr=self.args.right_gw_cidr)

        # TODO: Remove `forwarding_mac` when Agent is functional
        snat_vm = SNATVirtualMachine(vm_id,
                                     nic_left,
                                     nic_right,
                                     forwarding_mac=self.args.forwarding_mac,
                                     vm_location=self.args.vm_location,
                                     vhd_path=self.args.vhd_path)
        snat_vm.create(self.args.mgmt_vswitch_name)
        try:
            snat_vm.attach_vrouter(self.args.vrouter_vswitch_name)
            snat_vm.spawn()

            ipam = MgmtIPAM(self.args.mgmt_vswitch_name)
            mgmt_ip = ipam.generate()
            snat_vm.inject_ip(mgmt_ip, self.args.mgmt_vswitch_name)

            snat_vm.set_snat(mgmt_ip)
            snat_vm.register()
        except:
            snat_vm.cleanup()
            raise
Пример #8
0
    def create(self):
        """Creates and configures a SNAT VM"""
        vm_id = validate_uuid(self.args.vm_id)

        nic_left = None
        if uuid.UUID(self.args.vmi_left_id):
            nic_left = VMPort(uuid=self.args.vmi_left_id,
                              prefix=LEFT_DEV_PREFIX,
                              mac=self.args.vmi_left_mac,
                              ip_cidr=self.args.vmi_left_ip,
                              gw_cidr=self.args.left_gw_cidr)

        nic_right = None
        if uuid.UUID(self.args.vmi_right_id):
            nic_right = VMPort(uuid=self.args.vmi_right_id,
                               prefix=RIGHT_DEV_PREFIX,
                               mac=self.args.vmi_right_mac,
                               ip_cidr=self.args.vmi_right_ip,
                               gw_cidr=self.args.right_gw_cidr)

        # TODO: Remove `forwarding_mac` when Agent is functional
        snat_vm = SNATVirtualMachine(vm_id, nic_left, nic_right,
                                     forwarding_mac=self.args.forwarding_mac,
                                     vm_location=self.args.vm_location,
                                     vhd_path=self.args.vhd_path)
        snat_vm.create(self.args.mgmt_vswitch_name)
        try:
            snat_vm.attach_vrouter(self.args.vrouter_vswitch_name)
            snat_vm.spawn()

            ipam = MgmtIPAM(self.args.mgmt_vswitch_name)
            mgmt_ip = ipam.generate()
            snat_vm.inject_ip(mgmt_ip, self.args.mgmt_vswitch_name)

            snat_vm.set_snat(mgmt_ip)
            snat_vm.register()
        except:
            snat_vm.cleanup()
            raise
    def destroy(self):
        """Destroys a SNAT VM"""
        vm_id = validate_uuid(self.args.vm_id)

        nic_left = None
        if uuid.UUID(self.args.vmi_left_id):
            nic_left = VMPort(uuid=self.args.vmi_left_id,
                              prefix=LEFT_DEV_PREFIX)

        nic_right = None
        if uuid.UUID(self.args.vmi_right_id):
            nic_right = VMPort(uuid=self.args.vmi_right_id,
                               prefix=RIGHT_DEV_PREFIX)

        snat_vm = SNATVirtualMachine(vm_id,
                                     nic_left,
                                     nic_right,
                                     vhd_path=self.args.vhd_path)
        try:
            snat_vm.unregister()
        finally:
            snat_vm.cleanup()
    def create(self):
        netns_name = validate_uuid(self.args.vm_id)

        nic_left = {}
        if uuid.UUID(self.args.vmi_left_id).int:
            nic_left['uuid'] = validate_uuid(self.args.vmi_left_id)
            if self.args.vmi_left_mac:
                nic_left['mac'] = netaddr.EUI(self.args.vmi_left_mac,
                                              dialect=netaddr.mac_unix)
            else:
                nic_left['mac'] = None
            if self.args.vmi_left_ip:
                nic_left['ip'] = netaddr.IPNetwork(self.args.vmi_left_ip)
            else:
                nic_left['ip'] = None

        nic_right = {}
        if uuid.UUID(self.args.vmi_right_id).int:
            nic_right['uuid'] = validate_uuid(self.args.vmi_right_id)
            if self.args.vmi_right_mac:
                nic_right['mac'] = netaddr.EUI(self.args.vmi_right_mac,
                                               dialect=netaddr.mac_unix)
            else:
                nic_right['mac'] = None
            if self.args.vmi_right_ip:
                nic_right['ip'] = netaddr.IPNetwork(self.args.vmi_right_ip)
            else:
                nic_right['ip'] = None

        netns_mgr = NetnsManager(netns_name,
                                 nic_left,
                                 nic_right,
                                 root_helper=self.args.root_helper,
                                 cfg_file=self.args.cfg_file,
                                 update=self.args.update,
                                 gw_ip=self.args.gw_ip,
                                 pool_id=self.args.pool_id,
                                 loadbalancer_id=self.args.loadbalancer_id)

        if (self.args.update is False):
            if netns_mgr.is_netns_already_exists():
                # If the netns already exists, destroy it to be sure to set it
                # with new parameters like another external network
                if self.args.service_type == self.LOAD_BALANCER:
                    netns_mgr.release_lbaas('create')
                netns_mgr.unplug_namespace_interface()
                netns_mgr.destroy()
            netns_mgr.create()

        if self.args.service_type == self.SOURCE_NAT:
            netns_mgr.set_snat()
        elif self.args.service_type == self.LOAD_BALANCER:
            if (netns_mgr.set_lbaas() == False):
                netns_mgr.destroy()
                msg = 'Falied to Launch LOADBALANCER'
                raise Exception(msg)
        else:
            msg = ('The %s service type is not supported' %
                   self.args.service_type)
            raise NotImplementedError(msg)

        netns_mgr.plug_namespace_interface()
Пример #11
0
 def destroy(self):
     vm_name = validate_uuid(self.args.vm_id)
     self._stop(vm_name, self.args.vmi_left_id, self.args.vmi_right_id,
                self.args.vmi_management_id)
     self._client.remove_container(vm_name)
Пример #12
0
    def create(self):
        vm_name = validate_uuid(self.args.vm_id)
        image_name = self.args.image
        if self.args.instance_data:
            instance_data = json.loads(self.args.instance_data)
        else:
            instance_data = {}

        try:
            self._client.inspect_image(image_name)
        except APIError as e:
            if e.response.status_code == 404:
                self._client.pull(image_name)
                self._client.inspect_image(image_name)
            else:
                raise
        if self.args.command is not None:
            command = self.args.command
        elif "command" in instance_data:
            command = instance_data["command"]
        else:
            # use container default
            command = None
        try:
            container = self._client.inspect_container(vm_name)
            docker_id = container["Id"]
        except APIError as e:
            if e.response.status_code == 404:
                result = self._client.create_container(
                    image=image_name, name=vm_name, command=command, detach=True,
                    stdin_open=True, tty=True)  # keep the container running
                docker_id = result["Id"]
            else:
                logging.error('Error when inspecting docker '
                              'container: %s, status code %d, error: %s',
                              vm_name, e.response.status_code, str(e))
                raise
        self._stop(vm_name, self.args.vmi_left_id, self.args.vmi_right_id,
                   self.args.vmi_management_id)

        if self.args.vmi_left_id is not None:
            nic_left = self._create_nic_def(self.args.vmi_left_id,
                                            self.args.vmi_left_mac,
                                            self.args.vmi_left_ip)
        else:
            nic_left = None

        if self.args.vmi_right_id is not None:
            nic_right = self._create_nic_def(self.args.vmi_right_id,
                                             self.args.vmi_right_mac,
                                             self.args.vmi_right_ip)
        else:
            nic_right = None

        if self.args.vmi_management_id is not None:
            nic_management = self._create_nic_def(self.args.vmi_management_id,
                                                  self.args.vmi_management_mac,
                                                  self.args.vmi_management_ip)
            nic_management['name'] = ("mng-" + nic_management['uuid']
                                      )[:NetnsManager.DEV_NAME_LEN]
            nic_management = [nic_management]
        else:
            nic_management = []

        self._client.start(docker_id, network_mode='none')
        docker_pid = self._client.inspect_container(docker_id)['State']['Pid']
        netns_mgr = NetnsManager(vm_name, nic_left, nic_right,
                                 other_nics=nic_management,
                                 namespace_name=str(docker_pid))

        if not os.path.exists("/var/run/netns/"):
            os.makedirs("/var/run/netns/")
        if netns_mgr.is_netns_already_exists():
            # If the netns already exists, destroy it to be sure to set it
            # with new parameters like another external network
            netns_mgr.unplug_namespace_interface()
            netns_mgr.destroy()

        # connect docker network stack as new netns on which we will work
        os.symlink("/proc/%s/ns/net" % docker_pid,
                   "/var/run/netns/%s" % docker_pid)
        netns_mgr.create()
        netns_mgr.plug_namespace_interface()
 def destroy(self):
     vm_name = validate_uuid(self.args.vm_id)
     self._stop(vm_name, self.args.vmi_left_id, self.args.vmi_right_id,
                self.args.vmi_management_id)
     self._client.remove_container(vm_name)
    def create(self):
        vm_name = validate_uuid(self.args.vm_id)
        image_name = self.args.image
        if self.args.instance_data:
            instance_data = json.loads(self.args.instance_data)
        else:
            instance_data = {}

        try:
            self._client.inspect_image(image_name)
        except APIError as e:
            if e.response.status_code == 404:
                self._client.pull(image_name)
                self._client.inspect_image(image_name)
            else:
                raise
        if self.args.command is not None:
            command = self.args.command
        elif "command" in instance_data:
            command = instance_data["command"]
        else:
            # use container default
            command = None
        try:
            container = self._client.inspect_container(vm_name)
            docker_id = container["Id"]
        except APIError as e:
            if e.response.status_code == 404:
                result = self._client.create_container(
                    image=image_name,
                    name=vm_name,
                    command=command,
                    detach=True,
                    stdin_open=True,
                    tty=True)  # keep the container running
                docker_id = result["Id"]
            else:
                logging.error(
                    'Error when inspecting docker '
                    'container: %s, status code %d, error: %s', vm_name,
                    e.response.status_code, str(e))
                raise
        self._stop(vm_name, self.args.vmi_left_id, self.args.vmi_right_id,
                   self.args.vmi_management_id)

        if self.args.vmi_left_id is not None:
            nic_left = self._create_nic_def(self.args.vmi_left_id,
                                            self.args.vmi_left_mac,
                                            self.args.vmi_left_ip)
        else:
            nic_left = None

        if self.args.vmi_right_id is not None:
            nic_right = self._create_nic_def(self.args.vmi_right_id,
                                             self.args.vmi_right_mac,
                                             self.args.vmi_right_ip)
        else:
            nic_right = None

        if self.args.vmi_management_id is not None:
            nic_management = self._create_nic_def(self.args.vmi_management_id,
                                                  self.args.vmi_management_mac,
                                                  self.args.vmi_management_ip)
            nic_management['name'] = (
                "mng-" + nic_management['uuid'])[:NetnsManager.DEV_NAME_LEN]
            nic_management = [nic_management]
        else:
            nic_management = []

        self._client.start(docker_id, network_mode='none')
        docker_pid = self._client.inspect_container(docker_id)['State']['Pid']
        netns_mgr = NetnsManager(vm_name,
                                 nic_left,
                                 nic_right,
                                 other_nics=nic_management,
                                 namespace_name=str(docker_pid))

        if not os.path.exists("/var/run/netns/"):
            os.makedirs("/var/run/netns/")
        if netns_mgr.is_netns_already_exists():
            # If the netns already exists, destroy it to be sure to set it
            # with new parameters like another external network
            netns_mgr.unplug_namespace_interface()
            netns_mgr.destroy()

        # connect docker network stack as new netns on which we will work
        os.symlink("/proc/%s/ns/net" % docker_pid,
                   "/var/run/netns/%s" % docker_pid)
        netns_mgr.create()
        netns_mgr.plug_namespace_interface()