Пример #1
0
 def ListRoutes(self, namespace_ref):
   messages = self._messages_module
   request = messages.ServerlessNamespacesRoutesListRequest(
       parent=namespace_ref.RelativeName())
   with metrics.record_duration(metrics.LIST_ROUTES):
     response = self._client.namespaces_routes.List(request)
   return [service.Service(item, messages) for item in response.items]
Пример #2
0
 def ListConfigurations(self, namespace_ref):
   messages = self._messages_module
   request = messages.ServerlessNamespacesConfigurationsListRequest(
       parent=namespace_ref.RelativeName())
   with metrics.record_duration(metrics.LIST_CONFIGURATIONS):
     response = self._client.namespaces_configurations.List(request)
   return [service.Service(item, messages) for item in response.items]
Пример #3
0
  def GetService(self, service_ref):
    """Return the relevant Service from the server, or None if 404."""
    messages = self._messages_module
    service_get_request = messages.ServerlessNamespacesServicesGetRequest(
        name=service_ref.RelativeName())

    try:
      with metrics.record_duration(metrics.GET_SERVICE):
        service_get_response = self._client.namespaces_services.Get(
            service_get_request)
      return service.Service(service_get_response, messages)
    except api_exceptions.HttpNotFoundError:
      return None
Пример #4
0
  def _UpdateOrCreateService(self, service_ref,
                             config_changes):
    """Apply config_changes to the service. Create it if necessary."""
    messages = self._messages_module
    # GET the Service
    serv = self.GetService(service_ref)
    if serv:
      # PUT the changed Service
      for config_change in config_changes:
        config_change.AdjustConfiguration(serv.configuration, serv.metadata)
      serv_name = service_ref.RelativeName()
      serv_update_req = (
          messages.ServerlessNamespacesServicesReplaceServiceRequest(
              service=serv.Message(),
              name=serv_name))
      with metrics.record_duration(metrics.UPDATE_SERVICE):
        updated = self._client.namespaces_services.ReplaceService(
            serv_update_req)
      return service.Service(updated, messages)

    else:
      # POST a new Service
      new_serv = service.Service.New(self._client, service_ref.namespacesId)
      new_serv.name = service_ref.servicesId
      pretty_print.Info('Creating new service [{bold}{service}{reset}]',
                        service=new_serv.name)
      parent = service_ref.Parent().RelativeName()
      for config_change in config_changes:
        config_change.AdjustConfiguration(new_serv.configuration,
                                          new_serv.metadata)
      serv_create_req = (
          messages.ServerlessNamespacesServicesCreateRequest(
              service=new_serv.Message(),
              parent=parent))
      with metrics.record_duration(metrics.CREATE_SERVICE):
        raw_service = self._client.namespaces_services.Create(
            serv_create_req)
      return service.Service(raw_service, messages)
Пример #5
0
  def DeleteRevision(self, revision_ref):
    """Delete the provided Revision.

    Args:
      revision_ref: Resource, a reference to the Revision to delete

    Raises:
      RevisionNotFoundError: if provided revision is not found.
    """
    messages = self._messages_module
    revision_name = revision_ref.RelativeName()
    request = messages.ServerlessNamespacesRevisionsDeleteRequest(
        name=revision_name)
    try:
      with metrics.record_duration(metrics.DELETE_REVISION):
        self._client.namespaces_revisions.Delete(request)
    except api_exceptions.HttpNotFoundError:
      raise serverless_exceptions.RevisionNotFoundError(
          'Revision [{}] could not be found.'.format(revision_ref.revisionsId))
Пример #6
0
  def GetRevision(self, revision_ref):
    """Get the revision.

    Args:
      revision_ref: Resource, revision to get.

    Returns:
      A revision.Revision object.
    """
    messages = self._messages_module
    revision_name = revision_ref.RelativeName()
    request = messages.ServerlessNamespacesRevisionsGetRequest(
        name=revision_name)
    try:
      with metrics.record_duration(metrics.GET_REVISION):
        response = self._client.namespaces_revisions.Get(request)
      return revision.Revision(response, messages)
    except api_exceptions.HttpNotFoundError:
      return None
Пример #7
0
    def GetConfiguration(self, service_ref):
        """Return the relevant Configuration from the server, or None if 404."""
        messages = self._messages_module
        name = self._registry.Parse(
            service_ref.servicesId,
            params={
                'namespacesId': service_ref.namespacesId,
            },
            collection='serverless.namespaces.configurations').RelativeName()
        configuration_get_request = (
            messages.ServerlessNamespacesConfigurationsGetRequest(name=name))

        try:
            with metrics.record_duration(metrics.GET_CONFIGURATION):
                configuration_get_response = self._client.namespaces_configurations.Get(
                    configuration_get_request)
            return configuration.Configuration(configuration_get_response,
                                               messages)
        except api_exceptions.HttpNotFoundError:
            return None
Пример #8
0
    def _GetRoute(self, service_ref):
        """Return the relevant Route from the server, or None if 404."""
        messages = self._messages_module
        # GET the Route
        route_name = self._registry.Parse(
            service_ref.servicesId,
            params={
                'namespacesId': service_ref.namespacesId,
            },
            collection='serverless.namespaces.routes').RelativeName()
        route_get_request = messages.ServerlessNamespacesRoutesGetRequest(
            name=route_name, )

        try:
            with metrics.record_duration(metrics.GET_ROUTE):
                route_get_response = self._client.namespaces_routes.Get(
                    route_get_request)
            return route.Route(route_get_response, messages)
        except api_exceptions.HttpNotFoundError:
            return None
Пример #9
0
  def DeleteService(self, service_ref):
    """Delete the provided Service.

    Args:
      service_ref: Resource, a reference to the Service to delete

    Raises:
      ServiceNotFoundError: if provided service is not found.
    """
    messages = self._messages_module
    service_name = service_ref.RelativeName()
    service_delete_request = messages.ServerlessNamespacesServicesDeleteRequest(
        name=service_name,
    )

    try:
      with metrics.record_duration(metrics.DELETE_SERVICE):
        self._client.namespaces_services.Delete(service_delete_request)
    except api_exceptions.HttpNotFoundError:
      raise serverless_exceptions.ServiceNotFoundError(
          'Service [{}] could not be found.'.format(service_ref.servicesId))
Пример #10
0
    def ListRevisions(self, namespace_ref, service_name):
        """List all revisions for the given service.

    Args:
      namespace_ref: Resource, namespace to list revisions in
      service_name: str, The service for which to list revisions.

    Returns:
      A list of revisions for the given service.
    """
        messages = self._messages_module
        request = messages.ServerlessNamespacesRevisionsListRequest(
            parent=namespace_ref.RelativeName(), )
        if service_name is not None:
            # For now, same as the service name, and keeping compatible with
            # 'service-less' operation.
            request.labelSelector = 'serving.knative.dev/service = {}'.format(
                service_name)
        with metrics.record_duration(metrics.LIST_REVISIONS):
            response = self._client.namespaces_revisions.List(request)
        return [revision.Revision(item, messages) for item in response.items]
Пример #11
0
  def _UpdateOrCreateService(self, service_ref, config_changes, with_code):
    """Apply config_changes to the service. Create it if necessary.

    Arguments:
      service_ref: Reference to the service to create or update
      config_changes: list of ConfigChanger to modify the service with
      with_code: boolean, True if the config_changes contains code to deploy.
        We can't create the service if we're not deploying code.

    Returns:
      The Service object we created or modified.
    """
    nonce = _Nonce()
    config_changes = [_NewRevisionForcingChange(nonce)] + config_changes
    messages = self._messages_module
    # GET the Service
    serv = self.GetService(service_ref)
    try:
      if serv:
        if not with_code:
          # Avoid changing the running code by making the new revision by digest
          self._EnsureImageDigest(serv, config_changes)
        # PUT the changed Service
        for config_change in config_changes:
          config_change.AdjustConfiguration(serv.configuration, serv.metadata)
        serv_name = service_ref.RelativeName()
        serv_update_req = (
            messages.ServerlessNamespacesServicesReplaceServiceRequest(
                service=serv.Message(),
                name=serv_name))
        with metrics.record_duration(metrics.UPDATE_SERVICE):
          updated = self._client.namespaces_services.ReplaceService(
              serv_update_req)
        return service.Service(updated, messages)

      else:
        if not with_code:
          raise serverless_exceptions.ServiceNotFoundError(
              'Service [{}] could not be found.'.format(service_ref.servicesId))
        # POST a new Service
        new_serv = service.Service.New(self._client, service_ref.namespacesId)
        new_serv.name = service_ref.servicesId
        pretty_print.Info('Creating new service [{bold}{service}{reset}]',
                          service=new_serv.name)
        parent = service_ref.Parent().RelativeName()
        for config_change in config_changes:
          config_change.AdjustConfiguration(new_serv.configuration,
                                            new_serv.metadata)
        serv_create_req = (
            messages.ServerlessNamespacesServicesCreateRequest(
                service=new_serv.Message(),
                parent=parent))
        with metrics.record_duration(metrics.CREATE_SERVICE):
          raw_service = self._client.namespaces_services.Create(
              serv_create_req)
        return service.Service(raw_service, messages)
    except api_exceptions.HttpBadRequestError as e:
      error_payload = exceptions_util.HttpErrorPayload(e)
      if error_payload.field_violations:
        if (serverless_exceptions.BadImageError.IMAGE_ERROR_FIELD
            in error_payload.field_violations):
          exceptions.reraise(serverless_exceptions.BadImageError(e))
      exceptions.reraise(e)