Servicios compartidos

Un servicio compartido es un patrón predefinido que se despliega y se comparte con varios despliegues de aplicación del cliente, como sistemas virtuales y aplicaciones virtuales, en la nube. Un servicio compartido proporciona ciertos servicios de tiempo de ejecución para varias aplicaciones o servicios al usuario por parte de varias aplicaciones.

Normalmente sólo se encuentra una única referencia al servicio compartido por grupo de nubes, que es un grupo físico de hardware que define una nube. Este servicio compartido puede ser utilizado por todos los despliegues de aplicación en grupo de nubes, lo que significa que el servicio compartido debe proporcionar acceso multiarrendatario.

Infraestructura de servicio compartido

La infraestructura proporciona un entorno de administración comuna y servicios de registro. Se permite una única referencia a un servicio compartido en cada grupo de nubes (cuando se despliega en el perfil de entorno de a unión-nube ) y en cada perfil de entorno (cuando se despliega en un perfil de entorno de multi-cloud ). Todos los paneles de la interfaz de usuario habilitan el despliegue y la gestión de los servicios compartidos. Puede crear dos tipos de servicios compartidos, uno con las máquinas virtuales creadas en grupo de nubes y el otro, que es una referencia externa a un servicio fuera de grupo de nubes.

Un registro contiene información sobre los servicios compartidos desplegados en cada grupo de nubes. El cliente de un servicio compartido puede solicitar el registro para obtener información sobre el servicio compartido con el que desea comunicarse. La implementación del servicio compartido determina qué información necesita el cliente y qué versiones de la API del cliente admite.

Creación de una implementación de servicio compartido

Se desarrolla un servicio compartido de una manera parecida para las aplicaciones virtuales. Hay metadatos y prestaciones extra en algunos casos de ejemplo. La lista siguiente describe los pasos que se deben seguir para desarrollar un servicio.
  1. Cree los metadatos de propiedad y el modelo de aplicación predefinidos.
    El archivo appmodel.json representa la serialización del modelo definido en la interfaz de usuario del Creador de patrones para una aplicación virtual normal. Se representan los componentes (nodos) y enlaces, junto con los valores de propiedad especificados de usuario. Para los servicios compartidos, las propiedades deben estar predefinidas. Además de los nodos, enlaces y otros atributos de un modelo de aplicación, serán necesarios los siguientes atributos para un servicio compartido:
    app_type
    Se establece en "service".
    serviceversion
    Versión del modelo de aplicación de servicio compartido y único en formato VRMF. Por ejemplo, 1.0.0.0.
    servicesupportedclients
    Lista de las versiones de cliente admitidas que pueden utilizar este servicio compartido.
    Los patrones de ejemplo son:
    • *: coincide con todas las versiones
    • [a,b]: coincide con todas las versiones entre a y b, incluyendo a y b
    • (a,b): coincide con todas las versiones entre a y b, excluyendo a y b
    • [*,b]: coincide con todas las versiones hasta b, incluyendo b
    • [a,*]: coincide con todas las versiones de a y posteriores
    servicedisplayname
    Muestra el nombre de los servicios que se agrupan de forma parecida.
    servicename
    Nombre del servicio. Utilizado como el nombre del registro de servicios de los documentos.
    id
    Se establece en "sharedservice". Este atributo es un atributo que está en un nodo.
    type
    Es el ID exclusivo que enlaza los metadatos transformer y appmodel al nodo.
    servicetype
    Se establece External en appmodel.json para identificar un servicio como compartido y externo.
    En el ejemplo siguiente se muestra el uso de estos atributos:
    {
       "model":{
    		"name":"Shared Service",
    		"app_type":"service",
    		"patterntype":"foundation",
    		"version":"1.0",
    		"serviceversion":"1.0.0.0",
    		"servicesupportedclients":"[0.0,1.0]",
    		"servicedisplayname":"servicegroup",
    		"servicename":"service",
    		"description":"comments",
    		"nodes":[{
    			 "attributes":{...},
    			"id":"sharedservice",
    			"type":"uniqueComponentOSGIID"
    		}],
    		"links":[]
    	}
    }

    El archivo appmodel/metadata.json describe los componentes, enlaces y políticas implementadas por el plugin. Los servicios compartidos utilizan el mismo diseño que el del atributo. Se pueden establecer los atributos predeterminados mediante el atributo especificado en el campo predefinido appmodel o el campo sampleValue en metadata.json.

  2. Defina un tipo de proveedor de registro.

    El registro del servicio compartido contiene la información que pueden buscar los clientes y así encontrar la información necesaria que está compartida con el servicio. La infraestructura proporciona una capacidad mediante una determinada implementación del servicio compartido de la clase com.ibm.maestro.iaas.RegistryProvider. El siguiente método permite al servicio compartido devolver información al cliente basándose en su modelo y la configuración del despliegue.

    public JSONArtifact getRegistry(String ClientVersion, Map<String, JSONObject> deploymentInfo throws HttpException;

    deploymentInfo contiene los documentos appmodel (appmodel.json), de despliegue (deployment.json), de topología (topology.json) y de registro (registry.json).

  3. Cree la plantilla de topología para appmodel.
    Los transformadores con servicios que convierten el modelo de aplicación de una descripción lógica en un documento de topología que se utiliza para desplegar la aplicación virtual. Los servicios compartidos, como otros plugins, pueden definir una plantilla de un documento de topología y transformadores que convierten la plantilla a un documento de topología real durante el despliegue. Se debe proporcionar el siguiente atributo mediante un servicio compartido para hacer referencia al tipo de proveedor de registro del servicio compartido:
     "service-registry": [{
            "type": "<RegistryProvider implementation>"
        
    }],

    No incluya la sección del atributo vm-templates para una plantilla de topología de servicio compartido y externo hasta que no apunte a la implementación de recurso externo del servicio compartido.

  4. Cree scripts de ciclo vital de servicio compartido.

    Para obtener más información sobre cómo desarrollar scripts de ciclo de vida, consulte la sección Desarrollo de scripts de ciclo de vida que hay en la guía de desarrollo del plugin. Al desarrollar scripts de ciclo de vida para servicios compartidos, debe tener en cuenta funciones que puedan soportar y recuperar anomalías, proporcionando operaciones administrativas para el servicio, la escalabilidad y otras funciones parecidas.

  5. Opcional. Realice un certificado público de servicio compartido disponible para el acceso al cliente.

    La infraestructura proporciona una ubicación central para certificados. Un servicio compartido deberá hacer disponible de forma segura los certificados para que los despliegues actúen como clientes. Se pueden llamar las siguientes API com.ibm.maestro.iaas.RegistryService mediante el servicio compartido para que gestionen sus certificados:

    public void putCertificate(RestClient restClient, String putObj, String cloudGroup, String sharedServiceName, String sharedServiceVersion) throws CredentialExpiredException, MaestroSecurityException, HttpException;

    public void deleteCertificate(RestClient restClient, String cloudGroup, String sharedServiceName, String sharedServiceVersion) throws CredentialExpiredException, MaestroSecurityException, HttpException;

  6. Muestre llamadas administrativas HTTP para que los clientes interactúen con el servicio.

    Todos los servicios compartidos deben mostrar una interfaz administrativa HTTP a los clientes para que puedan registrarse e interactuar con el servicio (reservar recursos en el servicio). A continuación, se puede personalizar el uso del servicio utilizando los recursos reservados en una interacción que no sea HTTP. Este paso es donde la versión del cliente le ayuda a determinar el contrato de cliente para la interacción administrativo HTTP antes de que utilice el servicio.

    El entorno Infraestructura del servicio compartido proporciona una característica de ayuda para poder crear fácilmente la interfaz administrativa HTTP si el servicio compartido desea utilizar dicha interfaz. Para obtener más información, consulte la sección "Interacción de cliente y soporte de la API REST del servicio compartido genérico".

Despliegue de cliente de servicios compartidos

Se pueden habilitar despliegues de solicitudes en un modelo del consumidor del servicio compartido:
  • Por la exposición directa de un recurso mediante el modelador de aplicación virtual (un ejemplo sería la política de direccionamiento que permite a un despliegue ser un cliente de servicio compartido de equilibrador de carga basado en direccionador a demanda).
  • Utilizar de manera indirecta una configuración que implique el uso de un servicio compartido. La política de escalado implica el almacenamiento en memoria caché de sesiones HTTP y permite que un despliegue sea un cliente en el servicio compartido de almacenamiento en memoria caché.
  • Uso del proceso de transformación de appmodel que inyecta el cliente. El proceso añade paquetes, parámetros, referencias de servicio y otros elementos de plugin del cliente mientras el proceso crea el documento de topología.
La infraestructura admite que la referencia de servicio de despliegue previo compruebe si se han realizado en nombre del cliente del servicio compartido y pueda detener el despliegue de los recursos de creación en la nube.
  • El cliente puede indicar a los servicios a los que hace referencia y si el servicio puede determinar si continúa el despliegue. La etiqueta siguiente en el documento de topología de cliente indica que este cliente requiere que el servicio compartido al que hace referencia para dar soporte a una versión de cliente de 3.0 esté disponible en el grupo de nubes en el que se está desplegando. Si no es así, el despliegue del cliente fallará.
       "service-templates": [
    		{
    			"sharedservice": {
    				"client-version": "3.0", 
    				"name": "shared service name>", 
    				"required": true
    			}
    		}
        ]
  • El cliente puede definir ServiceProvisioner para proporcionar los recursos necesarios. Puede comunicarse con el servicio compartido recuperando su información de registro y proporcionando la información de entrada del documento de topología para poderlo utilizar más tarde. El despliegue puede fallar en esta etapa, así como el cliente. El cliente obtiene información sobre el servicio compartido llamando a la interfaz com.ibm.maestro.iaas.RegistryService y el método getRegistry: public JSONArtifact getRegistry(RestClient restClient, String sharedServiceName, String clientCloudGroup, String clientVersion, String clientDeploymentId) throws HttpException;

    Para obtener información sobre ServiceProvisioner, consulte la documentación de Javadoc en el Kit de desarrollo de plug-ins.

El despliegue previo puede comunicarse con el servicio compartido mediante sus scripts de ciclo de vida cuando los paquetes de plugin del cliente se extraen en las máquinas virtuales desplegadas. La infraestructura proporciona una biblioteca Python maestro.registry para su registro y el certificado relacionado con las llamadas de método desde los scripts de ciclo de vida.
import maestro
parms=maestro.registry.getRegistry(shared_service_name, shared_service_client_version)
masterIP = parms['<registry parm name>']
Se puede utilizar la llamada removeRegistryRef cuando el cliente ya no desea conectarse con el servicio compartido o cuando el cliente esté a punto de ser eliminado:
import maestro
maestro.registry.removeRegistryRef(shared_service_name, shared_service_client_version)
Si el servicio compartido expone un certificado público en la infraestructura de servicio compartido y, a continuación, el cliente podrá obtener el certificado con el mandato siguiente:
import maestro 
maestro.registry.getCertificate(shared_service_name, shared_service_client_version, temp_cert_file)
El siguiente ejemplo muestra cómo utilizar los mandatos precedentes en un script de ciclo de vida. El script muestra la dirección IP de un Almacenamiento en memoria caché compartidodesplegado, descarga el certificado público y proporciona una señal al servicio que el script ha terminado de ejecutar.
import maestro

service_name = "caching"
client_version = "2.0"

# get registry information
registry_info = maestro.registry.getRegistry(service_name, client_version)
ip_address = registry_info['cache-ip']

print "Caching service found at " + ip_address


# this is where the certificate will be stored
certificate_location = "/tmp/caching_certificate"

# download certificate
maestro.registry.getCertificate(service_name, client_version, certificate_location)

# signal the service that we have finished interacting with it
maestro.registry.removeRegistryRef(service_name, client_version)

Los proveedores de servicios compartidos deben limpiar el modelo de interacción del cliente que se basa en las habilidades que el servicio proporciona. Prepare la interacción utilizando la versión del cliente, que se convierte en un contrato de cliente y que define exactamente lo que se espera de la versión. Las versiones de servicio compartido diferentes pueden devolver información de otro tipo mediante el registro del cliente. El suministrador de servicio del cliente y los scripts de ciclo de vida deben comprender la manera correcta de comunicarse con el servicio basado en la respuesta del registro. Por ejemplo, suponga una versión 1.0 de servicio compartido que devuelve los atributos de host, nombre de usuario y contraseña mediante una llamada getRegistry a su cliente con la versión 1.0. Si se añade un puerto a la respuesta, el servicio podrá indicar que será para clientes de la versión 2.0 que se escriben para grabar el atributo adicional. En la siguiente versión, el servicio podrá admitir ambos clientes con las versiones 1.0 y 2.0 y proporcionará los clientes con las respuestas previstas.

La versión del cliente también ayuda a la infraestructura de servicio compartido a determinar con qué versiones de servicio compartido puede interactuar el cliente en un grupo de nubes. Por ejemplo, si la versión 1.0 del servicio solo admite la versión 1.0, la infraestructura no devolverá un objeto de registro a un cliente con la versión 2.0 que solicita el registro.

Invocación de la operación y seguimiento del cliente de servicio compartido

Algunos servicios compartidos necesitarán seguir los clientes a los que se conecten. Será necesaria la habilidad para que el servicio compartido se pueda comunicar con los sucesos de ciclo de vida de inicio o final del cliente. El cliente puede elegir detener la información solicitada desde el servicio compartido al suprimir el cliente, por ejemplo. Esta capacidad se habilita incluyendo el atributo "trackclientusage" en los metadatos siguientes en la plantilla de máquina virtual de servicio compartido.
"service-registry": [{
        "type": "<RegistryProvider implementation>"
        "trackclientusage":true
        
}],

Si se especifican estos metadatos, la infraestructura mantendrá una lista de clientes que solicitan la información de registro desde el servicio. La infraestructura también da la posibilidad del servicio a llamar operaciones en clientes que se rastrean utilizando la infraestructura. Se define la operación en el cliente: public void callOperationOnSSClients(RestClient restClient, JSONObject serviceInfo, JSONObject operationParms) throws HttpException;

El ejemplo le muestra cómo llamar la operación desde el servicio compartido ServiceProvisioner
public StateAndDescription deleteService(String serviceReferenceName,
			JSONObject serviceDescription, RestClient restClient)
			throws Exception {
        final String METHOD_NAME = "deleteService";
        if (logger.isLoggable(Level.FINE)) {
            logger.logp(Level.FINE, CLASS_NAME, METHOD_NAME, "deleteService: " + serviceReferenceName + "/" + serviceDescription);
            logger.logp(Level.FINE, CLASS_NAME, METHOD_NAME, "Calling the disconnect operation on shared service clients");
        }
        
        JSONObject operationParms = new JSONObject();
        operationParms.put("role","<role_name>");
        operationParms.put("type", "<type_name>");
        operationParms.put("script", "<scriptname>");
        operationParms.put("method", "<method_name>");
        operationParms.put("parameters", new JSONObject());
        this.registrySvc.callOperationOnSSClients(restClient, serviceDescription, operationParms);

Determinados servicios compartidos pueden dar soporte al despliegue en un perfil de entorno de multi-cloud y también hacer que el despliegue esté disponible para su uso en otros perfiles de entorno de multi-cloud sin que sea necesario desplegar el servicio compartido en cada perfil de entorno de multi-cloud . Esto ayudaría a reducir la máquina virtual y otro consumo de recursos en Entornos multisistema. Esta capacidad se activa si se incluye el atributo "supportslinking" en los metadatos de la plantilla de la máquina virtual del servicio compartido.

"service-registry": [{
        "type": "<RegistryProvider implementation>"
        "trackclientusage":true,,
        "supportslinking":true
        
}],

Se crea una referencia al servicio compartido desplegado en los perfiles de entorno de multi-cloud donde se pone a disposición un servicio compartido desplegado. Si se especifican los metadatos anteriores y el servicio compartido desea realizar un seguimiento de los clientes y de las operaciones de llamada en ellos durante el ciclo de vida de la referencia además de la del servicio compartido desplegado, el servicio compartido deberá proporcionar una implementación de la interfaz SSReferenceServiceProvisioner. Para obtener información sobre SSReferenceServiceProvisioner, consulte la documentación de Javadoc en el Kit de desarrollo de plug-ins.

Interacción de cliente y soporte de la API REST del servicio compartido genérico

La infraestructura REST del servicio compartido ayuda a proporcionar un modelo de interacción basado en HTTP para que los clientes inicien métodos que muestran los servicios compartidos. Los servicios compartidos pueden proporcionar metadatos de operación y scripts Python que mejoren el método. El cliente puede llamar a las API REST de los servicios compartidos genéricos para que inicien las operaciones. Por ejemplo, un cliente puede llamar GET en el URL de REST: https://<Master_Agent_VM>:9999/sharedservice/<servicename>/<resource>

Siga estos pasos para configurar los metadatos del lado del servidor y la configuración.
  1. Se deben y proporcionar los metadatos del servicio en un archivo JSON y empaquetados en datos nodepart del servicio compartido. Por ejemplo: plugin/nodeparts/cachingrestapi/cachingrestapi/properties/cachingrestapi.json.
    El objeto JSON en los metadatos debe contener los siguientes atributos:
    servicename
    El nombre del servicio compartido: "caching".
    operations
    El servicio muestra la matriz JSON de operaciones. Todos los objetos que hay en la matriz definen los siguientes atributos:
    type
    Tipo de operación HTTP: GET, PUT, POST, o DELETE.
    parms
    La matriz JSON de los objetos que representa los parámetros de cada llamada de ese tipo. El objeto debe definir los siguientes atributos:
    resource
    Recurso en el que se lleva a cabo la operación. Correlaciona el segmento URL después de servicename en el URL de REST.
    role
    El rol se ejecuta en esta operación.
    script
    < nombre_script > < nombre_método >. The Python script that defines the operation and the method that starts.
    clientdeploymentexposure
    Opcional. Determina si la llamada se puede originar desde las máquinas virtuales desplegadas del cliente y desde el proceso KernelServices. El valor predeterminado es false.
    timeOut
    Opcional. Se ha excedido el tiempo de espera de la operación. El valor predeterminado es 60000. Si este atributo es 0, la operación se ejecuta de forma síncrona sin tiempo de espera. Si este atributo es mayor que 0, la operación espera durante el período de tiempo especificado, en milisegundos, para devolver la llamada. La operación responde con 202 HTTP si se produce un tiempo de espera excedido.
    pattern
    Este atributo se puede utilizar para que coincida con más segmentos del URL y parms en la operación. Una entrada envuelta en corchetes coincide como un par nombre-valor en el URL de entrada y pasa a la operación como parms. Por ejemplo, considere un URL de REST con el formato: https://<host>:<port>/sharedservices/caching/sessiongrid/gridA y un patrón {gridName}. El par nombre-valor gridName=gridA proporciona la operación como un argumento adicional.
    A continuación se muestra un ejemplo metadata json:
    {
    	"servicename": "caching", 
    	"operations": [
    		{
    			"type": "PUT", 
    			"parms": [
    				{
    					"resource": "sessionGrid", 
    					"role": "Caching-Master.Caching", 
    					"script": "restapi.py createSession",
    					"timeout": 1200000
    				},
    				{
    					"resource": "simpleGrid", 
    					"role": "Caching-Master.Caching", 
    					"script": "restapi.py createSimple"
    				},
    				{
    					"resource": "dynamicGrid", 
    					"role": "Caching-Master.Caching", 
    					"script": "restapi.py createDynamic"
    				}
    			]
    		}, 
    		{
    			"type":"DELETE",
    			"parms":[
    				{
    					"resource": "sessionGrid", 
    					"role": "Caching-Master.Caching", 
    					"script": "restapi.py deleteSession",
    					"pattern": "{gridname}"
    				}, 
    				{
    					"resource": "simpleGrid", 
    					"role": "Caching-Master.Caching", 
    					"script": "restapi.py deleteSimple",
    					"pattern": "{gridname}"
    				},
    				{
    					"resource": "dynamicGrid", 
    					"role": "Caching-Master.Caching", 
    					"script": "restapi.py deleteDynamic",
    					"pattern": "{gridname}"
    				}
    			]
    		},
    		{
    			"type":"GET",
    			"parms":[
    				{
    					"resource": "sessionGrid", 
    					"clientdeploymentexposure":true,
    					"role": "Caching-Master.Caching", 
    					"script": "restapi.py gridExists",
    					"pattern": "{gridname}"
    				},
    				{
    					"resource": "publicCert", 
    					"clientdeploymentexposure":true,
    					"role": "Caching-Master.Caching", 
    					"script": "restapi.py downloadCert",
    					"responseType": "zipFile"
    				}
    			]
    		}
    	]
    }
  2. Cuando la máquina virtual inicia el despliegue del servicio compartido, se deben copiar los metadatos en la siguiente ubicación de la máquina virtual: /0config/sharedservices/restmetadata/. Los metadatos se pueden copiar si se proporciona un script de instalación nodepart que se ejecute durante el despliegue. Por ejemplo: /plugin/nodeparts/cachingrestapi/common/install/7_cachingrestapi.py que contenga
    restapidir = '/0config/sharedservices/restmetadata'
    restapifile = '/cachingrestapi.json'
    restapi = '../../cachingrestapi/properties/cachingrestapi.json'
    
    os.popen('mkdir -p ' + restapidir)
    os.popen("mv " + restapi+ " "+ restapidir + restapifile)
  3. Proporcione la implementación de los métodos en un script Python. Defina operaciones que ejecuten parms desde diferentes recursos, el objeto JSON de entrada a la llamada de REST o la coincidencia de patrón de un URL. Por ejemplo: parts/caching.scripts/scripts/CachingMaster/restapi.py. El cliente pueden llamar a las API a través de los siguientes métodos prácticos:
    • Si llama operaciones en el servicio desde el proceso KernelServices, mediante un Suministrador de servicios, utilice el siguiente método que se define en com.ibm.maestro.iaas.RegistryService
      public OperationResponse callOperationOnSharedService(String serviceName, String clientCloudGroup, String clientVersion, 
      String serviceIP, String resourceUrl, String operationType, JSONObject operationParms) throws HttpException;
      Por ejemplo:
      JSONObject clientJSON = new JSONObject();
          	clientJSON.put("user", user);
          	clientJSON.put("password", password);
          	clientJSON.put("gridname", grid);
          	clientJSON.put("gridcap", cachingCap);
      
            OperationResponse response = this.registrySvc.callOperationOnSharedService("caching", (String)serviceDescription.get("cloud_group"), "3.0", ip,
            "sessionGrid", "PUT", clientJSON);
            int status = response.getStatusCode();
            JSONObject result = response.getOperationResponse();
    • Para despliegues de aplicación virtual, la infraestructura de servicios compartidos proporciona un programa de utilidad para interactuar con los servicios compartidos. Se puede acceder al programa de utilidad desde scripts de ciclo de vida.

      El script de programa de utilidad sólo proporciona un método, callSSrestapi: sharedservices.callSSrestapi(url, method, data=None, filepath_input=None, filepath_output=None). Este método realiza una llamada de API REST al URL especificado con el método especificado. La función devuelve un código de estado HTTP de la llamada y del documento JSON, si se han proporcionado.

      El interlocutor puede definir un parámetro filepath_input para que almacene el archivo devuelto en una determinada ubicación, si existe el directorio. Se espera el parámetro si el servicio compartido devuelve un archivo comprimido de la llamada. Nota: si no se establece filepath_input, se suprimirá cualquier respuesta del servicio compartido después de analizarla.

      Si el interlocutor envía un archivo al servicio compartido, se puede definir el parámetro filepath_output en la ubicación del archivo, pero el argumento method debe ser PUT o POST para enviar el archivo. Si se utilizan los métodos PUT o POST, aunque se esperan los argumentos data o filepath_output.

      Para acceder a esta función, debe incluir el siguiente código en el script de ciclo de vida:
      import sys
      ss_path = '/0config/nodepkgs/helper/scripts'
      if not ss_path in sys.path:
          sys.path.append(ss_path)
      import sharedservices
      Este script de ejemplo utiliza las funciones de programa de utilidad para comunicarse con el servicio compartido de almacenamiento en memoria caché. Recupera el certificado público y comprueba si existe una cuadrícula de almacenamiento en memoria caché.
      import sys
      
      ss_path = '/0config/nodepkgs/helper/scripts'
      if not ss_path in sys.path:
          sys.path.append(ss_path)
      import sharedservices
      
      service = "caching"
      version = "2.0"
      
      regInfo = maestro.registry.getRegistry(service, version)
      try:
          ipAddr = regInfo['cache-ip']
          print "caching service found at " + ipAddr
      except KeyError:
          print "caching service not found"
          sys.exit(1)
      
      
      cert_zip_location = "cert.zip"
      
      # download zip (that contains the certificate)
      cert_response = sharedservices.callSSrestapi("https://" + ipAddr + ":9999/sharedservice/caching/publicCert", 
      "GET", filepath_input=cert_zip_location)
      
      
      # check if a grid exists
      grid_name = "SomeGrid"
      
      http_code, grid_response = sharedservices.callSSrestapi("https://" + ipAddr + ":9999/sharedservice/caching/gridExists/", "GET")
      ret =  grid_response['OperationResults'][0]['return_value']
      
      if (ret.find(grid_name + ' does not exist') >= 0):
          print grid_name + " does not exist"
      else:
          print grid_name + " exists"
      
      # inform the caching service that we have finished interacting with it
      maestro.registry.removeRegistryRef(service, version)
    Se puede hacer una prueba manual de la API con el siguiente argumento en la máquina virtual desplegada:
    cd /0config  
    export $(./get_userdata.sh)  
    export header=$(/opt/python-2.6.4/bin/python create_security_header.py)
    curl -H "X-IWD-Authorization : $header" -kv -H Content-Type:application/json -X PUT -d '{"input":"hi"}' 
    https://<shared service IP:9999/sharedservice/<servicename>/<resourcename>

Interacción de cliente del sistema virtual con servicios compartidos

La infraestructura de servicios compartidos también proporciona soporte a los despliegues del sistema virtual para que sean clientes de servicios compartidos. Se pueden llamar a las siguientes bibliotecas y API mediante paquetes de script y sistemas virtuales. Deben solicitar el registro de servicio compartido, el inicio de las API REST que las muestra el servicio compartido y otras funciones.

El plugin de los servicios compartidos para los sistemas virtuales necesita que se instale maestro en un sistema virtual desplegado. De forma predeterminada, maestro no se habilita para dichos despliegues. Los pasos para habilitar maestro son:
  1. Pulse Catálogo > Plug-ins del sistema. desde el panel de control.
  2. Seleccione el tipo de patrón Foundation.
  3. Seleccione el plugin virtualsystem.
  4. Pulse Configurar.
  5. Establezca los Plug-ins para sistemas virtuales en enabled.

Después de seguir estos pasos, todos los patrones del sistema virtual desplegado instalarán maestro e incluirán el plugin de servicios compartidos para sistemas virtuales.

Los servicios compartidos es un paquete de nodos que intenta parecerse a los scripts de ciclo de vida de la aplicación virtual en dicha función. Sin embargo, hay bastantes diferentes en la operación y la manera cómo se llaman.

Para comunicarse con los servicios compartidos, debe importar el script de cliente del servicio compartido:
import sys
ss_path = '/0config/nodepkgs/helper/scripts'
if not ss_path in sys.path:
    sys.path.append(ss_path)
import sharedserviceclient
Después de importar el script, puede acceder a las siguientes funciones:
sharedserviceclient.getRegistry(service_name, client_version)
La función devuelve información de registro del servicio compartido si se admite la versión de cliente. A diferencia de maestro.registry.getRegistry, la función devolverá la respuesta como una serie de texto.
sharedserviceclient.removeRegistryRef(service_name, client_version)
Se llama a la función cuando un cliente finaliza la interacción con el servicio compartido y señala que el servicio debe limpiar cualquier recurso obsoleto. Si esta operación es correcta, el valor de retorno será 0.
sharedserviceclient.restapi(url, method, data=None)
La función llama al método de la API REST, utilizando corchetes, para comunicarse con el servicio compartido en el URL proporcionado. Los métodos aceptados son GET, DELETE, PUTy POST. Si el método es PUT o POST, el parámetro data será necesario.

El argumento de datos debe tener una serie de texto. De la misma manera, la función devolverá la respuesta del servicio como una serie de texto.

El siguiente ejemplo muestra cómo comunicarse con el servicio compartido de almacenamiento en memoria caché para ver si existe una cuadrícula de datos con nombre:
import sys
ss_path = '/0config/nodepkgs/helper/scripts'
if not ss_path in sys.path:
    sys.path.append(ss_path)
import sharedserviceclient


def find_cache_IP(reg_info):
    """
Finds the Caching Shared Service IP address in the registry information.
    """
    str_info = str(reg_info)
    
    start = 'cache-ip":"'
    end = '",'
    
    start_cip = str_info.find(start)
    end_cip = str_info.find(end, start_cip)
    
    return str_info[start_cip+len(start):end_cip]

def does_grid_exist(grid_name, caching_ip):
    """
Queries the Caching Shared Service to see if a grid exists.
Returns '1' if the grid exists, '0' otherwise.
    """
    str_reply = str(sharedserviceclient.restapi("https://" + cip + ":9999/sharedservice/caching/gridExists/" + grid_name, "GET", ""))
    
    if (str_reply.find(grid_name + ' does not exist') >= 0):
        return 0
    else:
        return 1


# figure out the caching service's IP address
reg = sharedserviceclient.getRegistry("caching", "2.0")
cip = find_cache_IP(reg)

# grid to read data from
grid_name = "WAS_GRID"

# ensure the grid exists
if (does_grid_exist(grid_name, cip)):
    print "Reading data from grid..."
    # read data from it
else:
    print "Grid '" + grid_name + "' doesn't exist"
    # ask somebody to create it

# done with caching server
sharedserviceclient.removeRegistryRef("caching", "2.0")