IS-Registry
Contents
Role
The IS-Registry is the gateway to entering in a gCube infrastructure for gCube resources by means of registering/unregistering their profiles.
The IS-Registry performs three fundamental tasks:
- decide if accept or not a new resource
- validate a resource before its registration
- execute post-deletion actions to keep consistent the IS content
Design
The design of the service is distributed across two port-types: the ResourceRegistration
and the Factory
. Both of them work in a stateless manner, however the Factory creates a stateful resource for notification purposes.
ResourceRegistration
The ResourceRegistration
port-type manages the registration/update/removal of GCUBE Resources. It is directly contacted only by the IS-Publisher in order to perform such operations.
It exposes three operations:
-
create
– which takes as input a CreateMessage containing the string serialization of the resource profile to register; -
update
– which takes as input an UpdateMessage containing the new profile that will replace an existing one; -
remove
– which takes as input a RemoveMessage containing the unique identifier of the resource to be removed and its type;
The first two operations throw an InvalidResourceFault
if the profile was not correct/valid and a ResourceNotAcceptedFault
if the profile was not accepted because of the instance's configured filters.
Factory
From the functional point of view, the Factory port-type is practically a wrapper around the ResourceRegistration
port-type to provide backwards compatibility to previous IS-Publisher and testers implementation. Therefore, it exposes the following operations:
-
createResource
-
updateResource
-
removeResource
that are mapped on the ResourceRegistration
's operations.
Using this port-type is strongly deprecated and it will likely disappear in the next releases of the service.
FactoryResource
At start up time, the Factory
port-type is in charge of creating the singleton FactoryResource
. This resource (whose name is derived from previous versions of the service) exposes a set of WS-ResourceProperties registered as Topics in the IS-Notifier, making possible for interested clients to subscribe on events representing the changes of status of Infrastructure constituents (e.g. the disappearance of a Running Instance).
This is the list of RPs exposed:
<xsd:element name="RegistryFactoryResourceProperties"> <xsd:complexType> <xsd:sequence> <xsd:element ref="tns:RunningInstance" minOccurs="1" maxOccurs="1"/> <xsd:element ref="tns:ExternalRunningInstance" minOccurs="1" maxOccurs="1"/> <xsd:element ref="tns:Service" minOccurs="1" maxOccurs="1"/> <xsd:element ref="tns:Collection" minOccurs="1" maxOccurs="1"/> <xsd:element ref="tns:GHN" minOccurs="1" maxOccurs="1"/> <xsd:element ref="tns:MetadataCollection" minOccurs="1" maxOccurs="1"/> <xsd:element ref="tns:GenericResource" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element>
and each element of the sequence is of type ResourceProperty
defined as follows:
<xsd:complexType name="RegistryProperty"> <xsd:sequence> <xsd:element name="uniqueID" type="xsd:string" nillable="true"/> <xsd:element name="profile" type="xsd:string" nillable="true"/> <xsd:element name="operationType" type="xsd:string" nillable="true"/> <xsd:element name="changeTime" type="xsd:dateTime" nillable="true"/> </xsd:sequence> </xsd:complexType>
Note that:
- uniqueID is the identifier of the resource
- profile is the string serialization of the resource's profile
- operationType is the type of operation performed on the resource (allowed values are: create, update, destroy)
- changeTime is the time stamp of the operation
Sample Usage
This section provides sample usage of the ResourceRegistration port-type. The Factory port-type is obsolete and should not be used anymore.
Note that:
- due to the behavior of the IS-Publisher, any request is executed asynchronously (at the next scheduled bulk execution)
- if the operation is performed inside a service, the ServiceContext has to be used as GCUBESecurityManager (instead of the ad hoc manager created here below).
Registering a new GCUBE Resource
The following test method show how to register a new GCUBE Resource:
import org.gcube.informationsystem.registry.stubs.resourceregistration.CreateMessage; import org.gcube.informationsystem.registry.stubs.resourceregistration.ResourceRegistrationPortType; import org.gcube.informationsystem.registry.stubs.resourceregistration.service.ResourceRegistrationServiceAddressingLocator; //... protected void registerResource(GCUBEResource resource, GCUBEScope scope) throws Exception { int timeout = 20000; StringWriter profile = new StringWriter(); resource.store(profile); GCUBESecurityManagerImpl manager = new GCUBESecurityManagerImpl() { public boolean isSecurityEnabled() { return false;} }; ResourceRegistrationServiceAddressingLocator locator = new ResourceRegistrationServiceAddressingLocator(); ResourceRegistrationPortType registration = locator.getResourceRegistrationPortTypePort(epr); registration = GCUBERemotePortTypeContext.getProxy(registration, scope, timeout, manager); try { CreateMessage message = new CreateMessage(); message.setProfile(profile.toString()); message.setType(resource.getType()); registration.create(message); } catch(Exception e) { logger.error("Failed to publish the GCUBE Resource ",e); } }
Updating an existing GCUBE Resource
The following test method show how to update an existing GCUBE Resource:
import org.gcube.informationsystem.registry.stubs.resourceregistration.UpdateMessage; import org.gcube.informationsystem.registry.stubs.resourceregistration.ResourceRegistrationPortType; import org.gcube.informationsystem.registry.stubs.resourceregistration.service.ResourceRegistrationServiceAddressingLocator; //... protected void updateResource(GCUBEResource resource, GCUBEScope scope) throws Exception { int timeout = 20000; StringWriter profile = new StringWriter(); resource.store(profile); GCUBESecurityManagerImpl manager = new GCUBESecurityManagerImpl() { public boolean isSecurityEnabled() { return false;} }; ResourceRegistrationServiceAddressingLocator locator = new ResourceRegistrationServiceAddressingLocator(); ResourceRegistrationPortType registration = locator.getResourceRegistrationPortTypePort(epr); registration = GCUBERemotePortTypeContext.getProxy(registration, scope, timeout, manager); try { UpdateMessage message = new UpdateMessage(); message.setUniqueID(profile.getID()); message.setXmlProfile(profile.toString()); message.setType(resource.getType()); registration.update(message); } catch(Exception e) { logger.error("Failed to update the GCUBE Resource ",e); } }
Removing a GCUBE resource
The following test method show how to remove a GCUBE Resource:
import org.gcube.informationsystem.registry.stubs.resourceregistration.RemoveMessage; import org.gcube.informationsystem.registry.stubs.resourceregistration.ResourceRegistrationPortType; import org.gcube.informationsystem.registry.stubs.resourceregistration.service.ResourceRegistrationServiceAddressingLocator; //... protected void unregisterResource(GCUBEResource resource, GCUBEScope scope) throws Exception { int timeout = 20000; GCUBESecurityManagerImpl manager = new GCUBESecurityManagerImpl() { public boolean isSecurityEnabled() { return false;} }; ResourceRegistrationServiceAddressingLocator locator = new ResourceRegistrationServiceAddressingLocator(); ResourceRegistrationPortType registration = locator.getResourceRegistrationPortTypePort(epr); registration = GCUBERemotePortTypeContext.getProxy(registration, scope, timeout, manager); try { RemoveMessage message = new RemoveMessage(); message.setUniqueID(this.getResourceID()); message.setType(resource.getType()); registration.remove(message); } catch(Exception e) { logger.error("Failed to remove the GCUBE Resource ",e); } }