Previous section.

Book 2: Inter-Domain Management: Interaction Translation (JIDM_IT)
Copyright © 1999 The Open Group

OSI Support Services

This chapter describes several optional services that may be used with this specification. None of these services is required to provide the full functionality of the model.

These services are:

Additionally, the OSI Management Information Repository functionality is described in a non-normative section at the end of this chapter.

OSI Caching and Tracking Services

Overview

To provide client applications with fast and efficient access to the values of an attribute of a managed object, it is desirable under certain circumstances to configure a CORBA ManagedObject object with the ability to cache information. If so configured, the CORBA ManagedObject object can maintain a local store of attribute values, thus eliminating the need to contact the real underlying managed object when this information is requested. This mechanism is referred to in this specification as caching. Caching is an optional mechanism which permits applications to avail of improved performance, at the cost of additional resource usage. Caching may be configured on individual managed objects, or on all managed objects of a class, or on all managed objects within a proxy agent.

Any managed object that has been configured with the ability to cache may also be optionally configured with the ability to dynamically update its cached attribute values in response to change notifications received from the underlying managed object. This ability is known as tracking. If a managed object is a tracking object, it will update its cached values in response to the notifications defined by the OSI Systems Management functions ( ObjectCreation(), ObjectDeletion(), AttributeValueChange(), StateChange(), and RelationshipChange()).

The caching and tracking functionality is intended to provide improved performance. The goals of providing this functionality are:

OSICaching Module


Table: OSICaching Module





#ifndef _OSICACHING_IDL_
#define _OSICACHING_IDL_
 
#include <OSIMgmt.idl>
 
#pragma prefix jidm.org
 
module OSICaching {
typedef unsigned long ExpirationInterval; // in seconds
typedef ASN1_ObjectIdentifier ManagedObjectClass;
typedef sequence <ManagedObjectClass> ManagedObjectClassSeq;
typedef ASN1_ObjectIdentifier AttrId;
typedef sequence < ASN1_ObjectIdentifier > AttrIdSeq;
 
// NoSuchAttributes is raised when any specified attribute identifiers
// are either unknown or invalid.
exception NoSuchAttributes {
AttrIdSeq unknown_attributes;
};
 
// AttributesNotCached is raised when any specified attribute
identifiers
// to relevant caching operations are not being cached.
exception AttributesNotCached {
AttrIdSeq attr_id_list;
};
 
// NoSuchObjectClasses is raised when any specified object classes are
// either unknown or invalid.
exception NoSuchObjectClasses {
ManagedObjectClassSeq unknown_mocs;
};
 
// ObjectClassesNotCached is raised when any specified object classes
// to relevant caching operations are not being cached.
exception ObjectClassesNotCached {
ManagedObjectClassSeq moc_list;
};
// InvalidObjectClassAttributesPairs is raised when any specified
attribute
// identifiers do not belong to the specified managed object class.
struct ObjectClassAttributesPair {
ManagedObjectClass moc;
AttrIdSeq attr_id_list;
};







typedef sequence<ObjectClassAttributesPair> ObjectClassAttributesPairSeq;
exception InvalidObjectClassAttributesPairs {
ObjectClassAttributesPairSeq invalid_pairs;
};
 
/* There may be situations when more than one type of error may occur
* because of a single invocation of an operation. To accurately convey
* the different types of error information, CacheConfigException is
used
* by some operations. If any of the members of the following exception
* are not relevant, then such members shall be empty sequences, i.e.,
* sequences of zero length. For example, when passing an argument of
* AttrIdSeq to remove cached attributes , the client may pass some invalid
* or unkown attribute identifiers, and some valid attribute identifiers
* that are not cached. In such situations, CacheConfigException is raised
* with the invalid or unknown attribute identifiers specified in the
* no_such_attributes member, the valid but not cached attribute
* identifiers specified in the attrs_not_cached member, and the rest of
* the members set to zero length sequences.
*/
exception CacheConfigException {
AttrIdSeq no_such_attributes;
ManagedObjectClassSeq no_such_classes;
AttrIdSeq attrs_not_cached;
ManagedObjectClassSeq mocs_not_cached;
ObjectClassAttributesPairSeq invalid_moc_attrs_pairs;
};
 
// abstract interface for configuring all caches
interface CacheConfigurator {
void set_default_expiration_interval (
in ExpirationInterval expiration_interval,
in boolean override_specific_settings
);
ExpirationInterval get_default_expiration_interval ();
 
void set_caching_enabled (
in boolean enabled,
in boolean override_specific_settings
);
boolean is_caching_enabled ();
};
 
// cached attribute information
struct CachedAttribute {
AttrId attr_id;
ExpirationInterval expiration_interval;
};
typedef sequence < CachedAttribute > CachedAttributeSeq;







// abstract interface to configure per-attribute cache
interface PerAttributeCacheConfigurator {
void add_cached_attributes (
in CachedAttributeSeq attr_list,
in boolean override_specific_settings
) raises ( NoSuchAttributes );
 
void remove_cached_attributes (
in AttrIdSeq attr_id_list,
in boolean override_specific_settings
) raises ( CacheConfigException );
 
CachedAttributeSeq get_cached_attributes ();
 
ExpirationInterval get_expiration_interval (
in AttrId attr_id
) raises ( CacheConfigException );
 
void set_expiration_interval(
in AttrIdSeq attr_id_list,
in ExpirationInterval interval
) raises ( CacheConfigException );
};
 
// managed object class with indicated attributes cached
struct CachedObjectClass {
ManagedObjectClass moc;
CachedAttributeSeq cached_attributes_list;
};
typedef sequence < CachedObjectClass > CachedObjectClassSeq;
 
// abstract interface to configure per-class cache
interface PerClassCacheConfigurator {
void add_cached_classes (
in CachedObjectClassSeq class_list,
in boolean override_specific_settings
) raises ( CacheConfigException );
 
void remove_cached_classes (
in ManagedObjectClassSeq moc_list,
in boolean override_specific_settings
) raises ( CacheConfigException );
 
void remove_cached_attributes_from_class_cache(
in ManagedObjectClass moc,
in AttrIdSeq attr_id_list,
in boolean override_specific_settings
) raises ( CacheConfigException );
 
CachedObjectClassSeq get_cached_classes ();
 







CachedAttributeSeq get_cached_attributes_for_class (
in ManagedObjectClass moc
) raises ( OSIMgmt::NoSuchObjectClass );
 
void set_expiration_interval_for_class (
in ManagedObjectClass moc,
in AttrIdSeq attr_list,
in ExpirationInterval extension_duration
) raises ( CacheConfigException );
};
 
interface ProxyAgent : OSIMgmt::ProxyAgent,
CacheConfigurator,
PerAttributeCacheConfigurator,
PerClassCacheConfigurator {};
 
interface ManagedObject : OSIMgmt::ManagedObject,
CacheConfigurator,
PerAttributeCacheConfigurator {
 
void refresh_cached_values (
in AttrIdSeq attr_list
) raises ( CacheConfigException );
 
void invalidate_cached_values (
in AttrIdSeq attr_list
) raises ( CacheConfigException );
};
 
};
 
#endif /* _OSICACHING_IDL_ */


Description of OSICaching Module
The interfaces and methods of the OSICaching module permit the configuration of attribute caching at multiple levels. The validity of the cached attribute values may also be controlled by setting appropriate expiration intervals, which can also be controlled at multiple levels.

The interfaces OSICaching::CacheConfigurator, OSICaching::PerAttributeCacheConfigurator, and OSICach-ing::PerClassCacheConfigurator are all abstract and should not be instantiated directly. Only the interfaces OSICaching::ProxyAgent and OSICaching::ManagedObject may be instantiated as concrete objects.

The attribute cache of any caching managed object is loaded with attribute values when the cache is initialized. This might happen at different times, such as after successful creation or before first access to the real managed object. Not all attributes of a managed object need be cached. The list of attributes that are cached for any given managed object may be configured at multiple levels, including the proxy agent level, the managed object class level, and on the individual managed object itself. The actual list of attributes that are in any given managed object's cache is the union of all the attributes requested to be cached at all these levels. The ability to selectively cache only certain attributes of interest affords the flexibility of not caching attributes that may be changing rapidly and dynamically in the underlying managed object, such as PDU counters, gauges, and clocks.

It is important to note that the cache is a read-only cache, and that there is no access to directly writing the cached attribute value. The managed object implementation automatically updates the cached attribute value when the appropriate attribute-changing or attribute-retrieving operations occur.

If the cached value of an attribute is valid, any request to read the value (such as in a get operation) will result in the request being serviced from the cache, thus precluding the need to contact the underlying managed object. If the cached value of an attribute is no longer valid (because its expiration interval has passed since the last update), any request to read the value will trigger an attribute fault, and will result in the request being serviced from the actual attribute value in the underlying managed object. A request to read the value of an attribute that is not in the cache is always serviced from the underlying managed object, as is the case for any regular (non-caching) CORBA managed object.

The attribute cache of a managed object is updated with the latest attribute values when a CMIS operation is successfully performed. At this time, the cache reflects the same attribute values that are reported back to the manager in the response, if those attributes are in the cache. Other cached attributes that are not affected by the operation will continue to retain their prior values. As soon as an attribute value in the cache is updated as a result of a CMIS operation, the expiration clock for this attribute is reset, and the duration of validity of this updated value will now be the full duration of the applicable expiration interval; this applies regardless of whether the previous cached value of the attribute had already expired or not. Specifically, the expiration timer for a cached attribute value is reset back to its full applicable duration when any the following occurs:

The duration of validity of any cached attribute value may be configured by the application. An application may cause a cached attribute value to remain permanently valid by setting an expiration interval of 0. This means that the cached attribute value never expires and an attribute fault to read the value from the underlying managed object is never necessary.

The cached value of an attribute is considered to be invalid when any of the following occurs:

In these cases, any attempt to read an attribute value always triggers an attribute fault.

An application may explicitly invalidate the cached values of an OSICaching::ManagedObject by invoking the method invalidate_cached_values() on it. This invalidates all its cached values immediately, even if their expiration intervals have not expired. An application may explicitly cause the cached values of an OSICaching::ManagedObject to be refreshed using the current values from the underlying GDMO managed object by invoking the method refresh_cached_values() on it. This also resets the expiration interval of the cached values back to their full duration.

A managed object's cache may be configured at multiple levels. In general, the list of attributes to be cached, and the expiration intervals for each, may be provided at the level of a proxy agent, a managed object class, or an individual managed object. The methods to apply these cache configuration policies are available on OSICaching::ProxyAgent and OSICaching::Man-agedObject. Note that the cache configuration interfaces on OSICaching::ProxyAgent imply that the caching policies apply to managed objects controlled by that ProxyAgent; they do not imply that the ProxyAgent object itself has any caching capabilities.

The levels of cache configuration available are prioritized. From the most general to the most specific, the levels are:

The cache configuration policy specified at a more specific level overrides the cache configuration policy specified at the less specific level. In particular, the following should be noted:

The caching policy in OSICaching::ProxyAgent established by the methods inherited from PerAt-tributeCacheConfigurator applies to all indicated attributes wherever they occur in any managed object, regardless of class. This permits the establishment of a caching policy for all occurrences of the same attribute in a proxy agent, even if there is no caching policy established at the managed object class level or managed object level, in that proxy agent. The caching policy established by the methods in OSICaching::ProxyAgent that are inherited from the PerClass-CacheConfigurator interface apply to all indicated attributes only if they occur in the managed objects of the indicated managed object class.

The methods on OSICaching::ManagedObject, including those inherited from PerAttributeCacheConfigurator, apply to the actual attributes in the managed object itself. These methods permit the addition or removal of attributes in the cache, changing expiration timeouts, refreshing cached values, or invalidating cached values.

While configuring the caching policy on a ProxyAgent or ManagedObject, a list of CachedAttribute structs (an attribute identifier coupled with an expiration interval), may be supplied. While configuring the caching policy on a ProxyAgent, a list of CachedObjectClass structs (a class name coupled with a list of CachedAttribute structs) may be supplied. If any of these lists is an empty sequence, it is interpreted to mean all. In addition, when empty lists are used, default expiration intervals are associated with all relevant attributes. Thus, a caching policy that applies to all attributes in a ProxyAgent, a ManagedObjectClass or a ManagedObject, or a caching policy that applies to all attributes of all managed object classes in a ProxyAgent, can be easily enforced by invoking the appropriate methods with an empty list argument.

The methods CacheConfigurator::set_default_expiration_interval() and CacheConfigura-tor::set_caching_enabled() permit the caching policy to be changed on a level-wide basis, at either the ProxyAgent level or the ManagedObject level. If set_default_expiration_interval() has never been called, the default expiration interval is considered to be zero (i.e. the cache never expires). The methods CacheConfigurator::get_default_expiration_interval() and CacheConfigurator::is_caching_enabled() indicates the state of the level-wide caching policy, at either the Proxy-Agent level or the ManagedObject level. The set_default_expiration_interval parameter will affect only those attributes that are cache-enabled. The override_specific_settingsparameter allows the flexibility to either retain any existing custom expiration intervals for some attributes, or change the interval to the specified value for all cache-enabled attributes including those that have custom expiration intervals.

This specification permits multiple ProxyAgent objects to represent the same underlying TMN agent. It also permits these multiple ProxyAgent objects to have different caching and tracking characteristics. For example, one ProxyAgent representing a particular TMN agent may have caching and tracking capabilities, while another ProxyAgent representing the same TMN agent may not. This implies that a ManagedObject accessed via the first ProxyAgent may be configured for caching and tracking, whereas a ManagedObject accessed via the second cannot be so configured.

The caching and tracking configuration applied to a ProxyAgent object apply to all managed objects references obtained from it. It should be noted that an IOR for a ManagedObject may be obtained from a ProxyAgent in several different ways:

A client application which obtains a ManagedObject IOR for a particular underlying GDMO managed object from a caching and tracking ProxyAgent will be able to take advantage of caching and tracking, whereas the same client application obtaining another ManagedObject IOR for the same underlying GDMO managed object from a non-caching and non-tracking Proxy-Agent will not be able to take any advantage of caching and tracking. Caching and tracking capabilities, therefore, are properties of the IOR of a ManagedObject, and not necessarily of the underlying managed object itself.

The following rules apply when changes are made to the caching policy after an existing caching policy has already been applied to various attributes:

Any method that changes the caching and tracking policy may throw exceptions such as NoSuchAttributes, NoSuchClasses, etc. The semantics of the exception are that all known OIDs are treated as requested, and the unknown OIDs are returned in the exception.

OSITracking Module


Table: OSITracking Module




#ifndef _OSITRACKING_IDL_
#define _OSITRACKING_IDL_
 
#include <OSICaching.idl>
 
#pragma prefix jidm.org
 
module OSITracking {
 
typedef OSICaching::ManagedObjectClassSeq ManagedObjectClassSeq;
typedef OSICaching::AttrIdSeq AttrIdSeq;
 
// abstract interface to configure all tracking
interface TrackConfigurator {
void set_tracking_enabled (
in boolean enabled,
in boolean override_specific_settings
);
 
boolean is_tracking_enabled ();
};
 
// abstract interface to configure per-attribute tracking
interface PerAttributeTrackConfigurator {
void add_tracked_attributes (
in AttrIdSeq attr_list,
in boolean override_specific_settings
) raises ( OSICaching::NoSuchAttributes );
 
// If the attr_id_list contains an attribute identifier that is not
// being tracked, then that attribute identifier is ignored
// by remove_tracked_attributes.
void remove_tracked_attributes (
in AttrIdSeq attr_id_list,
in boolean override_specific_settings
) raises ( OSICaching::NoSuchAttributes );
 
AttrIdSeq get_tracked_attributes ();
};







// managed object class with indicated attributes tracked
struct TrackedObjectClass {
OSICaching::ManagedObjectClass moc;
AttrIdSeq list_of_tracked_attributes;
};
 
typedef sequence < TrackedObjectClass > TrackedObjectClassSeq;
 
// TrackConfigException is similar in purpose to
// OSICaching::CacheConfigException
exception TrackConfigException {
ManagedObjectClassSeq no_such_mocs;
AttrIdSeq no_such_attr_ids;
OSICaching::ObjectClassAttributesPairSeq invalid_moc_attrs_pairs;
};
 
// abstract interface to configure per-class tracking
interface PerClassTrackConfigurator {
void add_tracked_classes (
in TrackedObjectClassSeq class_list,
in boolean override_specific_settings
) raises ( TrackConfigException );
 
void remove_tracked_classes (
in ManagedObjectClassSeq moc_list,
in boolean override_specific_settings
) raises ( OSICaching::NoSuchObjectClasses );
 
TrackedObjectClassSeq get_tracked_classes ();
 
AttrIdSeq get_tracked_attributes_for_class (
in OSICaching::ManagedObjectClass class_name
) raises ( OSIMgmt::NoSuchObjectClass );
};
 
interface ProxyAgent : OSICaching::ProxyAgent,
TrackConfigurator,
PerAttributeTrackConfigurator,
PerClassTrackConfigurator {};
 
interface ManagedObject : OSICaching::ManagedObject,
TrackConfigurator,
PerAttributeTrackConfigurator {};
 
};
 
#endif /* _OSITRACKING_IDL_ */


Description of OSITracking Module
The tracking mechanism is an extension to the caching mechanism specified above to permit the dynamic update of critical information, without the need for any application intervention.

A tracked attribute in a managed object is an attribute whose value in the cache is dynamically updated by way of notifications received from the underlying managed object. The ProxyAgent implementation dynamically updates its cache based on any information made available to it in notifications emitted by the underlying managed object, including at least the standard Systems Management notifications of object creation, object deletion, attribute value change, state change, and relationship change.

When a cached attribute value is dynamically updated as a result of notification tracking, the expiration timer for that cached attribute value is reset back to its full applicable duration of Validity, regardless of whether the prior cached value was still valid or had expired.

As with caching, tracking may be configured on a per proxy agent basis, per managed object class basis, and per individual managed object basis. These have the same meaning and same levels of overriding as caching.

An attribute value in a managed object may only be tracked if it is also cached. In particular, the list of attributes configured to be tracked must have been configured to also be in the cache at a prior time. Any attributes that are requested to be tracked at any given level, but are not in the cache configuration at that particular level, are ignored.

Mechanism to Obtain Cached/Tracked Services

The mechanism to obtain cached/tracked services is an extension to that used to obtain access to any managed domain, that is, using the ProxyAgentFinder::access_domain operation.

An additional set of Criteria are specified to gain access to these value added services, if available. These criteria are specified in the following tables.

Basic OSIMgmt ProxyAgentFinder Criteria repeats the basic OSIMgmt criteria needed to create an OSIMgmt::ProxyAgent. For use with caching and tracking, the criteria specified in Alternative for Caching/Tracking OSIMgmt ProxyAgentFinder may replace these, by specifying an already existing OSIMgmt::ProxyAgent, that represents the domain to be cached (and maybe tracked). Destruction of the original OSIMgmt::ProxyAgent is the responsibility of the application that created it.

Table: Basic OSIMgmt ProxyAgentFinder Criteria

Criterion Name Type of Value Meaning
domain title X227ACS::AE_titleType AE-title associated to the managed object domain for which access is requested. The wildcard address is allowed.
controller object JIDM::ProxyAgentController Reference associated to a JIDM::ProxyAgentController object registered by the manager (OPTIONAL).
access control X711CMI::AccessControlType Information to be used as input to access control functions in establishing default access privileges for all exchanges on the association (OPTIONAL).
requestor title X227ACS::AE_titleType Title used to denote the Manager which requested access to the OSI managed object domain (OPTIONAL).

Table: Alternative for Caching/Tracking OSIMgmt ProxyAgentFinder

Criterion Name Type of Value Meaning
proxy agent OSIMgmt::ProxyAgent Already existing ProxyAgent to which caching is to be applied
controller object JIDM::ProxyAgentController Reference associated to a JIDM::ProxyAgentController object registered by the manager, that controls destruction of the cached/tracked ProxyAgent (OPTIONAL).

In addition to either one of the above, the criteria specified in More Criteria for Caching/Tracking OSIMgmt ProxyAgentFinder must also be provided for caching (and tracking) to be activated.

The values passed with the criteria names ( caching and tracking) are implementation-defined. Each implementation should specify what the appropriate values for these criteria should be.

If caching is specified for a ProxyAgent using the criteria specified in Basic OSIMgmt ProxyAgentFinder Criteria, then it is an implementation issue whether there are really two separate ProxyAgents, one that does not support caching and another that does.

Table: More Criteria for Caching/Tracking OSIMgmt ProxyAgentFinder

Criterion Name Type of Value Meaning
caching any Caching is enabled; the value is implementation dependent.
tracking any Tracking is enabled; the value is implementation dependent (OPTIONAL)

Collection Service

Overview

The OSI Collection service specification provides facilities to manipulate arbitrary sets of OSIMgmt::ManagedObjects.

This service is patterned after the CORBA Collection Service specification (see reference [CORBASer-vices]), and reuses some of the concepts defined there. However, no direct interface re-use is attempted to be able to provide highly typed interfaces specific to OSI management environments and that take into account the distributed nature of the collections being manipulated.

It defines an OSICollection::Iterator interface, to be able to navigate, traverse and manipulate the collections:

OSICollection Module


Table: OSICollection Module





#ifndef _OSICOLLECTION_IDL_
#define _OSICOLLECTION_IDL_
 
#include <OSIMgmt.idl>
 
module OSICollection {
typedef OSIMgmt::ManagedObject ManagedObject;
typedef sequence<ManagedObject> ManagedObjectSeq;
exception IteratorInvalid {};
exception IteratorInBetween {};
exception CollectionInvalid {};
exception InNestedCollection {};
exception NotInNestedCollection {};
exception NotFound {};
exception InvalidName {};
 
interface Iterator {
// retrieving elements
boolean get_element (
out ManagedObject mo
) raises (IteratorInvalid, IteratorInBetween);
boolean get_n_elements (
in unsigned long how_many,
out ManagedObjectSeq mo_list
) raises (IteratorInvalid);







// moving iterator
void restart () raises (IteratorInvalid);
void set_to_next_element () raises (IteratorInvalid);
void set_to_next_nth_element (
in unsigned long how_many
) raises (IteratorInvalid);
 
// iterator state
void invalidate ();
boolean is_valid ();
boolean is_in_between ();
boolean is_equal (
in Iterator other
) raises (IteratorInvalid);
 
// cloning, assigning and destroying
Iterator clone ();
void assign (
in Iterator from_where
) raises (IteratorInvalid);
void destroy ();
};
 
typedef OSIMgmt::LinkedReplyHandler LinkedReplyHandler;
typedef OSIMgmt::EndOfRepliesHandler EndOfRepliesHandler;
 
//abstract base interface
interface BaseCollection {
// operations to perform on all elements in the collection
void perform_get (
in OSIMgmt::ASN1_ObjectIdentifierSeq attr_id_list,
in LinkedReplyHandler lrh,
in EndOfRepliesHandler eorh
);
void perform_set (
in OSIMgmt::SetOperationArgument modif_list,
in LinkedReplyHandler lrh,
in EndOfRepliesHandler eorh
);
void perform_action (
in ASN1_ObjectIdentifier action_id,
in ASN1_DefinedAny action_info,
in LinkedReplyHandler lrh,
in EndOfRepliesHandler eorh
);
void perform_delete (
in LinkedReplyHandler lrh,
in EndOfRepliesHandler eorh
);







// statistics
boolean is_empty ();
 
// creating iterators
Iterator create_iterator (
in boolean read_only
) raises (CollectionInvalid);
 
// destruction
void destroy ();
};
 
interface EnumCollection: BaseCollection {
// adding elements
void add_element (in ManagedObject element);
void add_elements (in ManagedObjectSeq elem_list);
void add_all_from (in BaseCollection collection);
 
// removing elements
void remove_element_at (
in Iterator where
) raises (IteratorInvalid, IteratorInBetween);
void remove_all ();
};
 
interface RuleCollection : BaseCollection {
ManagedObject get_base_object () raises ( CollectionInvalid );
X711CMI::ScopeType get_scope () raises ( CollectionInvalid );
X711CMI::CMISFilterType get_filter () raises ( CollectionInvalid );
X711CMI::CMISSyncType get_synchronization () raises ( CollectionInvalid );
};
 
interface CollectionFactory {
EnumCollection create_enum_collection ();
 
EnumCollection create_enum_collection_from_collection (
in BaseCollection collection
);
 
RuleCollection create_rule_collection (
in OSIMgmt::ManagedObject base_managed_object,
in X711CMI::ScopeType scope,
in X711CMI::CMISFilterType filter,
in X711CMI::CMISSyncType sync
);







RuleCollection create_rule_collection_by_name (
in OSIMgmt::ProxyAgent proxy_agent,
in CORBA::ScopedName base_mo_interface,
in CosNaming::Name base_mo_name,
in X711CMI::ScopeType scope,
in X711CMI::CMISFilterType filter,
in X711CMI::CMISSyncType sync
);
};
};
 
#endif /* _OSICOLLECTION_IDL_ */


Iterator Interface
The OSICollection::Iterator interface is similar to OSIMgmt::RepliesIterator in terms of navigation operations ( get_element(), get_n_elements()). The semantics and behaviour of these operations are the same as the equivalent operations specified in the OSIMgmt::RepliesIterator interface ( get_reply(), get_n_replies ).

This interface also adds a number of operations for different purposes:

Note that OSICollection::Iterators are managed iterators, as explained in the CORBA Collection Service specification. This means that the status of the iterator is always known, never undefined, specifically in the event the collection contents change.

The possible iterator states are:

A valid iterator remains valid as long as the element it points to remains in the collection. If the element is removed, the iterator goes to the in-between state. Certain operations require the iterator to be in a valid state (like all the *_at operations), while others work even when the iterator is in an in-between state (like get_n_elements). An iterator becomes invalid when it points to nothing (for example, it has been moved past the last element).

BaseCollection Interface
The OSICollection::BaseCollection is an abstract interface specification (that is, no objects may have this as its most derived interface) that provides the functionality that is common to all collections (enumerated or computed).

Specifically, it provides operations to allow:

If an object in a collection returns the standard CORBA exception OBJECT_NOT_EXIST when performing one of these global operations, the collection will inmediately remove the object from the collection, as this type of exception is definite.

EnumCollection Interface
The OSICollection::EnumCollections interface provides a general mechanism to group (otherwise not necessarily related) managed objects. Specifically, all the managed objects in a single collection are not required to belong to the same managed object domain (that is, their references might have been obtained through different OSIMgmt::ProxyAgents).

The member managed objects of an enumerated collection are added, removed and replaced from the collection on an individual basis ( add_element, add_element_set_iterator, remove_element_at, replace_element_at), or in batch mode ( add_elements, remove_all).

It is important to note that an OSICollection::Collection object does not maintain any specified order among its members. No assumption should be made regarding the retrieval order, as compared to the insertion order. However, ordering within the collection is implementation-defined; this means that any two traversals of an iterator over the same collection will return managed objects in exactly the same order if no membership manipulation has occurred in between the traversals.

RuleCollection Interface
The OSICollection::RuleCollection interface has its membership defined by its governing rule. Specifically, the rule is a scope and filter specification, specified to the collection factory at the time the rule collection is created. The governing rule of a rule collection is defined by:

Once created, the governing rule of a rule collection cannot be changed, because doing so may invalidate the existing collection membership. When a CMIS operation is invoked on a rule collection, the indicated base managed object, scope, and filter that form the collection's governing rule are the parameters used to invoke the scoped operation on the actual agent or agents that are spanned by that rule.

A CMIS synchronization (atomic or best effort) may also be specified for a rule collection. This synchronization parameter is used in the scoped request that is sent to the agent(s) when a CMIS operation is invoked on the rule collection.

When an iterator is requested from a rule collection (via the create_iterator() method), then a snapshot of the collection's membership is taken to serve the iterator. This snapshot must reflect the best available knowledge of the managed objects that meet the collection's defining rule at that time.

CollectionFactory Interface
The OSICollection::CollectionFactory interface provides methods to create EnumCollection and RuleCollection objects.

In particular the CollectionFactory interface allows:

Dynamic Management of ASN.1 Any Values

Overview

The dynamic management of CORBA::Any values facility, introduced in the CORBA 2.2 specification, enables the manipulation of CORBA::Any values at runtime, without having any static information (generated by an IDL compiler) about the type being carried inside the Any.

This facility extends the one above to support CORBA::Any values that originate from an ASN.1 specification that has been translated into IDL via the JIDM Specification Translation algorithm (see reference [XOJIDM]) in a way that is closer to the original ASN.1 type.

Note that all operations that may be performed through this interface may also be performed directly using the basic CORBA::DynAny interface. Additional functionality provided by this interface is the access to ASN.1 specific information, that might have been lost in the translation from ASN.1 to IDL (specifically, type constraints), and the ability to use the original ASN.1 names, instead of the translated IDL names. Also, mechanisms are provided to deal with common ASN.1 constructs such as OPTIONAL, DEFAULT and anonymous elements, in an easier manner.

The behaviour of DynAny objects has been defined in such a way as to enable efficient implementations in terms of allocated memory space and speed of access.

In order for this interface to be fully operational, and provide the above mentioned advantages, some mechanism (not specified here) to access cross-domain information is needed. The most likely scenario for this is the use of an OSI MIR (see OSI Management Information Repository). Aletrnative implementation mechanisms are possible.

The ASN1::DynAny IDL is patterned after the CORBA::DynAny IDL, with the following differences:

ASN1 Module

Note that all types, derived from ASN.1 or not, can be manipulated through this interface. If the type comes from ASN.1, then extra operations might be available (if needed) that could help to manipulate the value.

However, note that ALL operations are possible through the unextended CORBA::DynAny interface. The extra added value provided by the ASN1::DynAny extension is the fact that ASN.1 constraints might be checked by the implementation, if possible (this is not a mandatory conformance point for this facility, but a quality of implementation issue).


Table: ASN.1 Module Definition





#ifndef _ASN1_IDL_
#define _ASN1_IDL_
 
#include <orb.idl>
#include <ASN1Types.idl>
 
module ASN1 {
 
typedef CORBA::Identifier Identifier;
 
enum Kind {
ak_none, // used when value is not ASN.1 based
ak_null, ak_boolean,
ak_integer, ak_real,
ak_numericstring, ak_printablestring,
ak_visiblestring, ak_iso646string,
ak_graphicstring, ak_objectdescriptor,
ak_teletexstring, ak_t61string,
ak_generalizedtime, ak_utctime,
ak_octetstring, ak_generalstring,
ak_ia5string, ak_videotexstring,
ak_bmpstring, ak_universalstring,
ak_objectidentifier,
ak_bitstring,
ak_any, ak_definedany,
ak_external,
ak_enum,
ak_sequence, ak_set,
ak_sequenceof, ak_setof,
ak_choice
};
 
interface DynAny : CORBA::DynAny {
Kind asn1_kind() raises (Invalid);
Identifier asn1_type_name () raises (Invalid);
Identifier asn1_module_name() raises (Invalid);
Identifier asn1_module_nickname() raises (Invalid);
ASN1_ObjectIdentifier asn1_module_oid() raises (Invalid);
 
void asn1_assign (in DynAny asn1_dyn_any) raises (Invalid);
void from_dyn_any (in CORBA::DynAny dyn_any) raises (Invalid);
CORBA::DynAny to_dyn_any() raises (Invalid);
DynAny asn1_copy();
 
void insert_asn1_null(in ASN1_Null value) raises(InvalidValue);
void insert_asn1_boolean(in ASN1_Boolean value) raises(InvalidValue);
void insert_asn1_unsigned16(in ASN1_Unsigned16 value) raises(InvalidValue);







void insert_asn1_unsigned(in ASN1_Unsigned value) raises(InvalidValue);
void insert_asn1_unsigned64(in ASN1_Unsigned64 value) raises(InvalidValue);
void insert_asn1_integer16(in ASN1_Integer16 value) raises(InvalidValue);
void insert_asn1_integer(in ASN1_Integer value) raises(InvalidValue);
void insert_asn1_integer64(in ASN1_Integer64 value) raises(InvalidValue);
void insert_asn1_real(in ASN1_Real value) raises(InvalidValue);
void insert_asn1_numericstring(in ASN1_NumericString value) raises(InvalidValue);
void insert_asn1_printablestring(in ASN1_PrintableString value) raises(InvalidValue);
void insert_asn1_visiblestring(in ASN1_VisibleString value) raises(InvalidValue);
void insert_asn1_iso646string(in ASN1_ISO646String value) raises(InvalidValue);
void insert_asn1_graphicstring(in ASN1_GraphicString value) raises(InvalidValue);
void insert_asn1_objectdescriptor(in ASN1_ObjectDescriptor value) raises(InvalidValue);
void insert_asn1_teletexstring(in ASN1_TeletexString value) raises(InvalidValue);
void insert_asn1_t61string(in ASN1_T61String value) raises(InvalidValue);
 
void insert_asn1_generalizedtime(in ASN1_GeneralizedTime value) raises(InvalidValue);
void insert_asn1_utctime(in ASN1_UTCTime value) raises(InvalidValue);
 
void insert_asn1_octetstring(in ASN1_OctetString value) raises(InvalidValue);
void insert_asn1_generalstring(in ASN1_GeneralString value) raises(InvalidValue);
void insert_asn1_ia5string(in ASN1_IA5String value) raises(InvalidValue);
void insert_asn1_videotexstring(in ASN1_VideotexString value) raises(InvalidValue);
 
void insert_asn1_bmpstring(in ASN1_BMPString value) raises(InvalidValue);
void insert_asn1_universalstring(in ASN1_UniversalString value) raises(InvalidValue);
 
void insert_asn1_objectidentifier(in ASN1_ObjectIdentifier value) raises(InvalidValue);
 
void insert_asn1_bitstring(in ASN1_BitString value) raises(InvalidValue);
 
void insert_asn1_any(in ASN1_Any value) raises(InvalidValue);
void insert_asn1_definedany(in ASN1_DefinedAny value) raises(InvalidValue);
 
void insert_asn1_external(in ASN1_External value) raises(InvalidValue);
 
ASN1_Null get_asn1_null() raises(TypeMismatch);
ASN1_Boolean get_asn1_boolean() raises(TypeMismatch);
 
ASN1_Unsigned16 get_asn1_unsigned16() raises(TypeMismatch);
ASN1_Unsigned get_asn1_unsigned() raises(TypeMismatch);
ASN1_Unsigned64 get_asn1_unsigned64() raises(TypeMismatch);
ASN1_Integer16 get_asn1_integer16() raises(TypeMismatch);
ASN1_Integer get_asn1_integer() raises(TypeMismatch);
ASN1_Integer64 get_asn1_integer64() raises(TypeMismatch);
 
ASN1_Real get_asn1_real() raises(TypeMismatch);







ASN1_NumericString get_asn1_numericstring() raises(TypeMismatch);
ASN1_PrintableString get_asn1_printablestring() raises(TypeMismatch);
ASN1_VisibleString get_asn1_visiblestring() raises(TypeMismatch);
ASN1_ISO646String get_asn1_iso646string() raises(TypeMismatch);
ASN1_GraphicString get_asn1_graphicstring() raises(TypeMismatch);
ASN1_ObjectDescriptor get_asn1_objectdescriptor() raises(TypeMismatch);
ASN1_TeletexString get_asn1_teletexstring() raises(TypeMismatch);
ASN1_T61String get_asn1_t61string() raises(TypeMismatch);
 
ASN1_GeneralizedTime get_asn1_generalizedtime() raises(TypeMismatch);
ASN1_UTCTime get_asn1_utctime() raises(TypeMismatch);
 
ASN1_OctetString get_asn1_octetstring() raises(TypeMismatch);
ASN1_GeneralString get_asn1_generalstring() raises(TypeMismatch);
ASN1_IA5String get_asn1_ia5string() raises(TypeMismatch);
ASN1_VideotexString get_asn1_videotexstring() raises(TypeMismatch);
 
ASN1_BMPString get_asn1_bmpstring() raises(TypeMismatch);
ASN1_UniversalString get_asn1_universalstring() raises(TypeMismatch);
 
ASN1_ObjectIdentifier get_asn1_objectidentifier() raises(TypeMismatch);
ASN1_BitString get_asn1_bitstring() raises(TypeMismatch);
 
ASN1_Any get_asn1_any() raises(TypeMismatch);
ASN1_DefinedAny get_asn1_definedany() raises(TypeMismatch);
 
ASN1_External get_asn1_external() raises(TypeMismatch);
 
ASN1_Any current_asn1_component () raises(Invalid);
};
 
interface DynEnum: DynAny, CORBA::DynEnum {
attribute string value_as_asn1_identifier;
attribute long value_as_asn1_value;
};
 
interface DynNamedNumber: DynAny {
attribute string value_as_asn1_identifier;
};
 
typedef CORBA::FieldName FieldName;
typedef CORBA::NameValuePairSeq NameValuePairSeq;







interface DynSetSeq: DynAny, CORBA::DynStruct {
FieldName current_asn1_elem_name ();
Kind current_asn1_elem_kind ();
NameValuePairSeq get_asn1_elems() raises(Invalid);
void set_asn1_elems(in NameValuePairSeq value) raises (InvalidSeq);
void insert_optional_absent() raises (InvalidValue);
DynAny insert_optional_present() raises (InvalidValue);
void insert_default_absent() raises (InvalidValue);
DynAny insert_default_present() raises (InvalidValue);
boolean get_optional_presence() raises (TypeMismatch);
DynAny get_optional_present() raises (TypeMismatch);
boolean get_default_presence() raises (TypeMismatch);
DynAny get_default_present() raises (TypeMismatch);
};
 
interface DynChoice: DynAny, CORBA::DynUnion {
DynAny asn1_elem ();
attribute FieldName asn1_elem_name;
Kind asn1_elem_kind ();
};
 
interface DynSetSeqOf : DynAny, CORBA::DynSequence {
Kind asn1_item_kind ();
};
 
interface DynAnyFactory {
exception InconsistentKind {};
exception InconsistentTypeCode {};
 
typedef CORBA::Identifier Identifier;
 
DynAny create_asn1_dyn_any(in any value);
 
DynAny create_basic_dyn_any(in CORBA::TypeCode type)
raises(InconsistentTypeCode);
CORBA::DynStruct create_dyn_struct(in CORBA::TypeCode type)
raises(InconsistentTypeCode);
CORBA::DynSequence create_dyn_sequence(in CORBA::TypeCode type)
raises(InconsistentTypeCode);
CORBA::DynUnion create_dyn_union(in CORBA::TypeCode type)
raises(InconsistentTypeCode);
CORBA::DynEnum create_dyn_enum(in CORBA::TypeCode type)
raises(InconsistentTypeCode);
CORBA::DynArray create_dyn_array(in CORBA::TypeCode type)
raises(InconsistentTypeCode);
CORBA::DynFixed create_dyn_fixed(in CORBA::TypeCode type)
raises(InconsistentTypeCode);
 
DynAny create_asn1_dyn_primitive(in Identifier asn1_nickname,
in Identifier asn1_name)
raises(InconsistentKind);







DynEnum create_asn1_dyn_enum(in Identifier asn1_nickname,
in Identifier asn1_name)
raises(InconsistentKind);
DynSetSeq create_asn1_dyn_setseq(in Identifier asn1_nickname,
in Identifier asn1_name)
raises(InconsistentKind);
DynSetSeqOf create_asn1_dyn_setseqof(in Identifier asn1_nickname,
in Identifier asn1_name)
raises(InconsistentKind);
DynChoice create_asn1_dyn_choice(in Identifier asn1_nickname,
in Identifier asn1_name)
raises(InconsistentKind);
};
};
#endif /* _ASN1_IDL_ */


Description of ASN1 types and operations

Kind type
The ASN1::Kind type indentifies the ASN.1 type which is hold by a DynAny object. The specification provides functions in all modules to access the kind(s) at each level.

If the CORBA::TypeCode does not correspond to an ASN.1 type, the special kind of ak_none is used. In this case, none of the extended interfaces may be used (they will all return an appropriate exception: Invalid, InvalidValue of TypeMismatch).

Exceptions
The following inherited exceptions are used:
Type Identification
Besides getting the CORBA TypeCode, the ASN.1::DynAny interfaces provide methods to get the ASN.1 kind, type name, module name, OID and module nickname. If this is not an ASN.1 type, these would raise Invalid (except the ASN1::Kind would be ak_none); if unknown, they would be empty.
Lifecycle
Equivalent functions to the ones provided in CORBA::DynAny, with the same semantics.
Insertion Operations
The inherited operations work based on the CORBA::TypeCode, and shall work for all types (ASN.1 or otherwise).

In addition, there are different insertion operations per primitive ASN.1 type, even if they map to the same IDL type. In this way, the interface is more type safe (in the ASN.1 sense).

For example, if we have MyType::=INTEGER(1..500), then either insert_ushort or insert_asn1_unsigned16 would work. Both could check for the bounds, and return InvalidValue if the constraint is violated.

Note that there is nothing to insert an ASN1_Recursive: you have to use the appropriate type to be inserted (whatever would go in the any) if using the ASN1::DynAny interface, and insert_any if using the CORBA::DynAny interface. Again, if the wrong type is to be inserted in the any, then the exception could be raised.

Extraction Operations
The inherited operations work based on the CORBA::TypeCode, and shall work for all types (ASN.1 or otherwise).

In addition, there are different extraction operations per primitive ASN.1 type, even if they map to the same IDL type. In this way, the interface is more type safe (in the ASN.1 sense).

For example, in the case introduced above, either get_ushort or get_asn1_unsigned16 would work.

Note that there is nothing to extract an ASN1_Recursive: you have to extract the appropriate type (whatever is in the any) if using the ASN1::DynAny interface, and get_any if using the CORBA::DynAny interface. If the wrong type is to be extracted from the any, then the TypeMis-match exception should be raised.

Navigation Operations
In addition to the methods inherited from CORBA::DynAny, there is an extra method to get the current component as an ASN1::DynAny, rather than as a CORBA::DynAny (that would require narrowing for some operations).
Enumerated Interface
This provides operations to access names/values as specified in ASN.1. If these operations are not going to be available (because the type does not correspond to an ASN.1 enumerated value), then narrowing to this interface should fail.
NamedNumber Interface
This is a special case, as it is a primitive type, but has a subtype specification. It provides the ability to read or write values by their ASN.1 names. If these operations are not going to be available, then narrowing to this interface should fail.
SetSeq Interface
Instead of providing two exact interfaces, just one is provided for both SET and SEQUENCE types.

In addition to the operations to navigate the components, getting names, and inserting/extracting sequences (inherited from the CORBA::DynStruct interface), equivalent operations are provided with the ASN.1 counterparts. Specifically, field names, and insert/extract sequence would use ASN.1 type names, instead of the IDL equivalents inherited from the CORBA::DynStruct inter-face. Another difference is that in the ASN.1 sequences, fields that have the OPTIONAL or DEFAULT clauses might be omitted. Additionally, there are methods to insert absent/present optional (and defaulted) and also to check for the presence and value of such fields.

Choice Interface
As the inherited interface is almost complete, this interface only specifies duplicates of some operations to provide ASN.1 names/types.
SetSeqOf Interface
As with SetSeq, only one interface is specified for both SET OF and SEQUENCE OF types. The only added operation is the one to get the ASN.1 item kind.
DynAnyFactory
This factory is capable of creating DynAny's for both normal IDL types, and for ASN.1 types. Also, the creation methods are compatible and consistent with those provided by the ORB interface for IDL types.

OSI Management Information Repository

An OSI Management Information Repository (OSI MIR) contains the description and structure of the information models used within the TMN Management model.

This specification does not provide any standard interface for an OSI MIR, therefore allowing implementations of CORBA/TMN systems to provide this functionality using any appropriate mechanism.

An OSI MIR provides two services:

An OSI MIR allows managers and agents to dynamically access all information on a certain model, both as an original GDMO/ASN.1 model and as the equivalent IDL model. Among other things, this makes it feasible to dynamically process management requests without necessarily having any compile-time knowledge of which GDMO/ASN.1 documents and modules were processed and what mapping rules were applied for translation into IDL. With the assistance of an OSI MIR available at run time, an application may:

This specification allows implementations of CORBA/TMN systems to choose any approach to building an OSI MIR for providing dynamic, run-time metadata support to their applications, including, but not limited to, the following:



Why not acquire a nicely bound hard copy?
Click here to return to the publication details or order a copy of this publication.

Contents Next section Index