Beispiel #1
0
    def get_vswitch_list(self):
        smut_userid = zvmutils.get_smut_userid()
        rd = ' '.join(
            ("SMAPI %s API Virtual_Network_Vswitch_Query" % smut_userid,
             "--operands", "-s \'*\'"))
        with zvmutils.expect_request_failed_and_reraise(
                exception.ZVMNetworkError):
            try:
                result = self._request(rd)
            except exception.ZVMClientRequestFailed as err:
                emsg = err.format_message()
                if ((err.results['rc'] == 212) and (err.results['rs'] == 40)):
                    LOG.warning("No Virtual switch in the host")
                    return []
                else:
                    raise exception.ZVMNetworkError(
                        msg=("Failed to query vswitch list, %s") % emsg)

            if (not result['response'] or not result['response'][0]):
                return []
            else:
                data = '\n'.join([
                    s for s in result['response']
                    if isinstance(s, const._TSTR_OR_TUNI)
                ])
                output = re.findall('VSWITCH:  Name: (.*)', data)
                return output
Beispiel #2
0
    def _couple_nic(self, userid, vdev, vswitch_name, active=False):
        """Couple NIC to vswitch by adding vswitch into user direct."""
        requestData = ' '.join(
            ('SMAPI %s' % userid,
             "API Virtual_Network_Adapter_Connect_Vswitch_DM", "--operands",
             "-v %s" % vdev, "-n %s" % vswitch_name))

        with zvmutils.expect_request_failed_and_reraise(
                exception.ZVMNetworkError):
            self._request(requestData)

        # the inst must be active, or this call will failed
        if active:
            requestData = ' '.join(
                ('SMAPI %s' % userid,
                 'API Virtual_Network_Adapter_Connect_Vswitch', "--operands",
                 "-v %s" % vdev, "-n %s" % vswitch_name))

            try:
                self._request(requestData)
            except (exception.ZVMClientRequestFailed,
                    exception.ZVMClientInternalError) as err1:
                results1 = err1.results
                msg1 = err1.format_message()
                if ((results1 is not None) and (results1['rc'] == 204)
                        and (results1['rs'] == 20)):
                    LOG.warning(
                        "Virtual device %s already connected "
                        "on the active guest system", vdev)
                else:
                    persist_OK = True
                    requestData = ' '.join(
                        ('SMAPI %s' % userid,
                         'API Virtual_Network_Adapter_Disconnect_DM',
                         "--operands", '-v %s' % vdev))
                    try:
                        self._request(requestData)
                    except (exception.ZVMClientRequestFailed,
                            exception.ZVMClientInternalError) as err2:
                        results2 = err2.results
                        msg2 = err2.format_message()
                        if ((results2 is not None) and (results2['rc'] == 212)
                                and (results2['rs'] == 32)):
                            persist_OK = True
                        else:
                            persist_OK = False
                    if persist_OK:
                        msg = ("Failed to couple nic %s to vswitch %s "
                               "on the active guest system, %s") % (
                                   vdev, vswitch_name, msg1)
                    else:
                        msg = ("Failed to couple nic %s to vswitch %s "
                               "on the active guest system, %s, and "
                               "failed to revoke user direct's changes, "
                               "%s") % (vdev, vswitch_name, msg1, msg2)
                    raise exception.ZVMNetworkError(msg)
        """Update information in switch table."""
        self._NetDbOperator.switch_updat_record_with_switch(
            userid, vdev, vswitch_name)
Beispiel #3
0
    def _create_nic(self,
                    userid,
                    vdev,
                    nic_id=None,
                    mac_addr=None,
                    active=False):
        requestData = ' '.join(
            ('SMAPI %s API Virtual_Network_Adapter_Create_Extended_DM' %
             userid, "--operands", "-k image_device_number=%s" % vdev,
             "-k adapter_type=QDIO"))

        if mac_addr is not None:
            mac = ''.join(mac_addr.split(':'))[6:]
            requestData += ' -k mac_id=%s' % mac

        with zvmutils.expect_request_failed_and_reraise(
                exception.ZVMNetworkError):
            self._request(requestData)

        if active:
            if mac_addr is not None:
                LOG.warning("Ignore the mac address %s when "
                            "adding nic on an active system" % mac_addr)
            requestData = ' '.join(
                ('SMAPI %s API Virtual_Network_Adapter_Create_Extended' %
                 userid, "--operands", "-k image_device_number=%s" % vdev,
                 "-k adapter_type=QDIO"))

            try:
                self._request(requestData)
            except (exception.ZVMClientRequestFailed,
                    exception.ZVMClientInternalError) as err1:
                msg1 = err1.format_message()
                persist_OK = True
                requestData = ' '.join(
                    ('SMAPI %s API Virtual_Network_Adapter_Delete_DM' % userid,
                     "--operands", '-v %s' % vdev))
                try:
                    self._request(requestData)
                except exception.ZVMClientRequestFailed as err2:
                    results = err2.results
                    msg2 = err2.format_message()
                    if ((results['rc'] == 404) and (results['rs'] == 8)):
                        persist_OK = True
                    else:
                        persist_OK = False
                if persist_OK:
                    msg = ("Failed to create nic %s for %s on the active "
                           "guest system, %s") % (vdev, userid, msg1)
                else:
                    msg = ("Failed to create nic %s for %s on the active "
                           "guest system, %s, and failed to revoke user "
                           "direct's changes, %s") % (vdev, userid, msg1, msg2)
                raise exception.ZVMNetworkError(msg)

        self._NetDbOperator.switch_add_record_for_nic(userid,
                                                      vdev,
                                                      port=nic_id)
Beispiel #4
0
    def _uncouple_nic(self, userid, vdev, active=False):
        """Uncouple NIC from vswitch"""
        requestData = ' '.join(
            ('SMAPI %s' % userid, "API Virtual_Network_Adapter_Disconnect_DM",
             "--operands", "-v %s" % vdev))

        try:
            self._request(requestData)
        except (exception.ZVMClientRequestFailed,
                exception.ZVMClientInternalError) as err:
            results = err.results
            emsg = err.format_message()
            if ((results is not None) and (results['rc'] == 212)
                    and (results['rs'] == 32)):
                LOG.warning(
                    "Virtual device %s is already disconnected "
                    "in the guest's user direct", vdev)
            else:
                raise exception.ZVMNetworkError(
                    msg=("Failed to uncouple nic %s "
                         "in the guest's user direct,  %s") % (vdev, emsg))
        """Update information in switch table."""
        self._NetDbOperator.switch_updat_record_with_switch(userid, vdev, None)

        # the inst must be active, or this call will failed
        if active:
            requestData = ' '.join(
                ('SMAPI %s' % userid, 'API Virtual_Network_Adapter_Disconnect',
                 "--operands", "-v %s" % vdev))
            try:
                self._request(requestData)
            except (exception.ZVMClientRequestFailed,
                    exception.ZVMClientInternalError) as err:
                results = err.results
                emsg = err.format_message()
                if ((results is not None) and (results['rc'] == 204)
                        and (results['rs'] == 48)):
                    LOG.warning(
                        "Virtual device %s is already "
                        "disconnected on the active "
                        "guest system", vdev)
                else:
                    raise exception.ZVMNetworkError(
                        msg=("Failed to uncouple nic %s "
                             "on the active guest system, %s") % (vdev, emsg))
Beispiel #5
0
    def delete_nic(self, userid, vdev, active=False):
        rd = ' '.join(
            ("SMAPI %s API Virtual_Network_Adapter_Delete_DM" % userid,
             '-v %s' % vdev))
        with zvmutils.expect_request_failed_and_reraise(
                exception.ZVMNetworkError):
            try:
                self._request(rd)
            except exception.ZVMClientRequestFailed as err:
                results = err.results
                emsg = err.format_message()
                if ((results['rc'] == 404) and (results['rs'] == 8)):
                    LOG.warning(
                        "Virtual device %s does not exist in "
                        "the guest's user direct", vdev)
                else:
                    raise exception.ZVMNetworkError(
                        msg=("Failed to delete nic %s for %s in "
                             "the guest's user direct, %s") %
                        (vdev, userid, emsg))

        self._NetDbOperator.switch_delete_record_for_nic(userid, vdev)
        if active:
            rd = ' '.join(
                ("SMAPI %s API Virtual_Network_Adapter_Delete" % userid,
                 '-v %s' % vdev))
            with zvmutils.expect_request_failed_and_reraise(
                    exception.ZVMNetworkError):
                try:
                    self._request(rd)
                except exception.ZVMClientRequestFailed as err:
                    results = err.results
                    emsg = err.format_message()
                    if ((results['rc'] == 204) and (results['rs'] == 8)):
                        LOG.warning(
                            "Virtual device %s does not exist on "
                            "the active guest system", vdev)
                    else:
                        raise exception.ZVMNetworkError(
                            msg=("Failed to delete nic %s for %s on "
                                 "the active guest system, %s") %
                            (vdev, userid, emsg))
Beispiel #6
0
    def create_nic(self,
                   userid,
                   vdev=None,
                   nic_id=None,
                   mac_addr=None,
                   ip_addr=None,
                   active=False):
        ports_info = self._NetDbOperator.switch_select_table()
        vdev_info = []
        for p in ports_info:
            if p[0] == userid:
                vdev_info.append(p[1])

        if len(vdev_info) == 0:
            # no nic defined for the guest
            if vdev is None:
                nic_vdev = CONF.zvm.default_nic_vdev
            else:
                nic_vdev = vdev
        else:
            if vdev is None:
                used_vdev = max(vdev_info)
                nic_vdev = str(hex(int(used_vdev, 16) + 3))[2:]
            else:
                if self._is_vdev_valid(vdev, vdev_info):
                    nic_vdev = vdev
                else:
                    raise exception.ZVMInvalidInput(
                        msg=("The specified virtual device number %s "
                             "has already been used" % vdev))
        if len(nic_vdev) > 4:
            raise exception.ZVMNetworkError(
                msg=("Virtual device number %s is not valid" % nic_vdev))

        LOG.debug(
            'Nic attributes: vdev is %(vdev)s, '
            'ID is %(id)s, address is %(address)s', {
                'vdev': nic_vdev,
                'id': nic_id or 'not specified',
                'address': mac_addr or 'not specified'
            })
        self._create_nic(userid,
                         nic_vdev,
                         nic_id=nic_id,
                         mac_addr=mac_addr,
                         active=active)
        return nic_vdev
Beispiel #7
0
 def delete_vswitch(self, switch_name, persist=True):
     smut_userid = zvmutils.get_smut_userid()
     rd = ' '.join(
         ("SMAPI %s API Virtual_Network_Vswitch_Delete_Extended" %
          smut_userid, "--operands", "-k switch_name=%s" % switch_name,
          "-k persist=%s" % (persist and 'YES' or 'NO')))
     with zvmutils.expect_request_failed_and_reraise(
             exception.ZVMNetworkError):
         try:
             self._request(rd)
         except exception.ZVMClientRequestFailed as err:
             results = err.results
             emsg = err.format_message()
             if ((results['rc'] == 212) and (results['rs'] == 40)):
                 LOG.warning("Vswitch %s does not exist", switch_name)
                 return
             else:
                 raise exception.ZVMNetworkError(
                     msg=("Failed to delete vswitch %s: %s") %
                     (switch_name, emsg))