Example #1
0
    def get_manager(self, identity):
        """Get a manager by its identity

        :returns: Redfish manager UUID.
        :raises: NotFound if the manager cannot be found
        """
        try:
            system_uuid = self._systems.uuid(identity)
            system_name = self._systems.name(identity)
        except error.AliasAccessError:
            raise
        except error.NotFound:
            # Re-raise hiding the fact that managers are backed by systems
            msg = 'Manager with UUID %s was not found' % identity
            self._logger.error(msg)
            raise error.NotFound(msg)
        else:
            result = {
                'Id': system_uuid,
                'UUID': system_uuid,
                'Name': '%s-Manager' % system_name
            }
            self._logger.debug('Found manager %(mgr)s by UUID %(id)s', {
                'mgr': result,
                'id': identity
            })
            return result
def certificate_service_replace_certificate():
    if not flask.request.json:
        raise error.BadRequest("Empty or malformed certificate")

    try:
        cert_string = flask.request.json['CertificateString']
        cert_type = flask.request.json['CertificateType']
        cert_uri = flask.request.json['CertificateUri']
    except KeyError as exc:
        raise error.BadRequest(f"Missing required parameter {exc}")

    match = _VMEDIA_URI_PATTERN.search(cert_uri)
    if not match:
        raise error.NotFound(
            f"Certificates at URI {cert_uri} are not supported")

    if cert_type != 'PEM':
        raise error.BadRequest(
            f"Only PEM certificates are supported, got {cert_type}")

    manager_id, device, cert_id = match.groups()

    flask.current_app.managers.get_manager(manager_id)
    flask.current_app.vmedia.replace_certificate(
        manager_id, device, cert_id, cert_string, cert_type)

    return '', 204
Example #3
0
    def delete_certificate(self, identity, device, cert_id):
        device_info = self._get_device(identity, device)
        if cert_id != _CERT_ID or "Certificate" not in device_info:
            raise error.NotFound(f"Certificate {cert_id} not found")

        del device_info["Certificate"]
        self._devices[(identity, device)] = device_info
Example #4
0
def processor(identity, processor_id):
    processors = app.systems.get_processors(identity)

    for proc in processors:
        if proc['id'] == processor_id:
            return flask.render_template(
                'processor.json', identity=identity, processor=proc)

    raise error.NotFound()
Example #5
0
def ethernet_interface(identity, nic_id):
    nics = app.systems.get_nics(identity)

    for nic in nics:
        if nic['id'] == nic_id:
            return flask.render_template(
                'ethernet_interface.json', identity=identity, nic=nic)

    raise error.NotFound()
Example #6
0
def drive_resource(identity, stg_id, drv_id):
    uuid = app.systems.uuid(identity)
    drives = app.drives.get_drives(uuid, stg_id)

    for drv in drives:
        if drv['Id'] == drv_id:
            return flask.render_template(
                'drive.json', identity=identity, storage_id=stg_id, drive=drv)

    raise error.NotFound()
Example #7
0
def storage(identity, storage_id):
    uuid = app.systems.uuid(identity)
    storage_col = app.storage.get_storage_col(uuid)

    for stg in storage_col:
        if stg['Id'] == storage_id:
            return flask.render_template(
                'storage.json', identity=identity, storage=stg)

    raise error.NotFound()
Example #8
0
def simple_storage(identity, simple_storage_id):
    simple_storage_controllers = (
        app.systems.get_simple_storage_collection(identity))
    try:
        storage_controller = simple_storage_controllers[simple_storage_id]
    except KeyError:
        app.logger.debug('"%s" Simple Storage resource was not found')
        raise error.NotFound()
    return flask.render_template('simple_storage.json', identity=identity,
                                 simple_storage=storage_controller)
Example #9
0
    def replace_certificate(self, identity, device, cert_id, cert_string,
                            cert_type):
        device_info = self._get_device(identity, device)
        if cert_id != _CERT_ID or "Certificate" not in device_info:
            raise error.NotFound(f"Certificate {cert_id} not found")

        device_info["Certificate"] = {'Type': cert_type, 'String': cert_string}
        self._devices[(identity, device)] = device_info

        return Certificate(_CERT_ID, cert_string, cert_type)
    def test_locations(self, managers_mock, vmedia_mock):
        managers_mock.return_value.managers = ["1", "2"]
        vmedia_mock.return_value.devices = ["CD", "DVD"]
        vmedia_mock.return_value.list_certificates.side_effect = [
            error.NotFound(),
            [vmedia.Certificate("cert1", "abcd", "PEM")],
            [vmedia.Certificate("cert2", "abcd", "PEM")],
            error.NotFound(),
        ]
        response = self.app.get(
            'redfish/v1/CertificateService/CertificateLocations')

        self.assertEqual(200, response.status_code)
        self.assertEqual([
            '/redfish/v1/Managers/1/VirtualMedia/DVD/Certificates/cert1',
            '/redfish/v1/Managers/2/VirtualMedia/CD/Certificates/cert2'
        ], [
            item['@odata.id']
            for item in response.json['Links']['Certificates']
        ])
Example #11
0
    def _get(self, identity):
        try:
            result = self._systems[identity]
        except KeyError:
            try:
                uuid = self._by_name[identity]
            except KeyError:
                raise error.NotFound(f'Fake system {identity} was not found')
            else:
                raise error.AliasAccessError(uuid)

        # NOTE(dtantsur): since the state change can only be observed after
        # a _get() call, we can cheat a bit and update it on reading.
        return self._update_if_needed(result)
Example #12
0
    def _get_instance(self, identity):
        instance = self._cc.get_server(identity)
        if instance:
            if identity != instance.id:
                raise error.AliasAccessError(instance.id)

            return instance

        msg = ('Error finding instance by UUID "%(identity)s" at OS '
               'cloud %(os_cloud)s"' % {'identity': identity,
                                        'os_cloud': self._os_cloud})

        self._logger.debug(msg)

        raise error.NotFound(msg)
Example #13
0
def volume(identity, stg_id, vol_id):
    uuid = app.systems.uuid(identity)
    vol_col = app.volumes.get_volumes_col(uuid, stg_id)

    for vol in vol_col:
        if vol['Id'] == vol_id:
            vol_id = app.systems.find_or_create_storage_volume(vol)
            if not vol_id:
                app.volumes.delete_volume(uuid, stg_id, vol)
            else:
                return flask.render_template(
                    'volume.json', identity=identity, storage_id=stg_id,
                    volume=vol)

    raise error.NotFound()
Example #14
0
    def _get_device(self, identity, device):
        try:
            return self._devices[(identity, device)]

        except KeyError:
            self._devices.update({(identity, k): v
                                  for k, v in self._device_types.items()})

        try:
            return self._devices[(identity, device)]

        except KeyError:
            raise error.NotFound(
                'No such virtual media device %s owned by resource '
                '%s' % (device, identity))
Example #15
0
def virtual_media_get_certificate(identity, device, cert_id):
    flask.current_app.managers.get_manager(identity)
    location = (
        f'/redfish/v1/Managers/{identity}/VirtualMedia/{device}'
        f'/Certificates/{cert_id}'
    )
    certificates = flask.current_app.vmedia.list_certificates(identity, device)
    try:
        cert = next(c for c in certificates if c.id == cert_id)
    except StopIteration:
        raise error.NotFound()

    return flask.render_template(
        'certificate.json',
        location=location,
        cert_id=cert.id,
        cert_string=cert.string,
        cert_type=cert.type_,
    )
Example #16
0
    def _get_domain(self, identity, readonly=False):
        with libvirt_open(self._uri, readonly=readonly) as conn:
            try:
                uu_identity = uuid.UUID(identity)

                return conn.lookupByUUID(uu_identity.bytes)

            except (ValueError, libvirt.libvirtError):
                try:
                    domain = conn.lookupByName(identity)

                except libvirt.libvirtError as ex:
                    msg = ('Error finding domain by name/UUID "%(identity)s" '
                           'at libvirt URI %(uri)s": %(err)s' % {
                               'identity': identity,
                               'uri': self._uri,
                               'err': ex
                           })

                    self._logger.debug(msg)

                    raise error.NotFound(msg)

            raise error.AliasAccessError(domain.UUIDString())