[Hawkular-dev] Coming to inventory 0.4.0 - bulk create of entities
Lukas Krejci
lkrejci at redhat.com
Fri Sep 18 15:45:05 EDT 2015
Hi all,
pending a peer-review is a new feature in inventory to support bulk creation
of entities (in a single transaction).
So far, our REST API was rather granular and concentrated on working with
single entities or even their individual relationships. This was quite costly
especially during create, update or delete operations, where the clients would
need to do stuff one-by-one.
This is being addressed in Inventory 0.4.0 (hopefully coming to Hawkular
Alpha5) with a new REST endpoint called "/bulk".
For 0.4.0 we will only support bulk creation with update and delete coming in
the next versions.
The bulk endpoint accepts a rather complex javascript object that can be used
to specify what is being created and where. The best way to explain it is by
an example:
{
"/t;tenant": {
"environment": [
{
"id": "env1",
"properties": {"key": "value"}
},
{
"id": "env2",
"properties": {"key": "value2"}
}
],
"resourceType": [
{
"id": "URL"
}
],
"metricType": [
{
"id": "ResponseTime"
}
]
},
"/t;tenant/rt;URL": {
"data": [
{
"role": "configurationSchema",
"value": {
"title": "URL config schema",
"description": "A json schema describing configuration of an URL",
"type": "string"
}
}
],
"operationType": [
{
"id": "ping"
}
]
},
"/t;tenant/e;env1": {
"resource": [
{
"id": "url1",
"resourceTypePath": "/t;tenant/rt;URL"
}
],
"metric": [
{
"id": "url1_responseTime",
"metricTypePath": "/t;tenant/mt;ResponseTime"
}
]
},
"/t;tenant/e;env1/r;url1": {
"data": [
{
"role": "configuration",
"value": "http://redhat.com"
}
],
"relationship": [
{
"name": "incorporates",
"otherEnd": "/t;tenant/e;env1/m;url1_responseTime",
"direction": "outgoing"
}
]
}
}
The javascript object above would cause creation of 2 new environments, "env1"
and "env2", under the tenant "tenant", a new resource type called "URL" and a
new metric type called "ResponseTime".
When the URL resource type is created, a configuration schema is created for
it (and the configuration schema prescribes that the configuration of the URL
is merely a string). Additionally, an operation called "ping" is defined for
the resource type.
After that a new resource, "url1" is added to environment "env1" with the
"URL" resource type and a metric called "url1_responseTime" is also added to
the environment. Finally a configuration is added to the resource and the
resource is configured to incorporate the previously created metric.
The structure of the javascript object is following:
1) The top-level keys are paths to the inventory entities *under* which the
new entities should be added, e.g. the first key "/t;tenant" means that the
value of that key describes what should be created directly under a tenant
called "tenant". The second key, "/t;tenant/rt;URL", tells the REST API that
the value of that key describes what should be added "under" that resource
type.
The structure of what kinds of entities can contain what kinds of entities can
be found in the documentation [1].
Notice that the order of the keys in the object is significant.
2) The second-level keys describe what type of data to create under a given
parent (notice that you can create more than 1 type of data under some entity
types). The values of those keys are arrays of actual blueprint objects
describing the new entities to be created (each entity type can have different
format). The blueprint objects are the same as the ones passed in to the
granular REST endpoints that already exist.
The response always has the 201 - Created status code and is a JSON object
with the types of entities created as keys and values are again objects with
keys being the canonical paths to the entities created and values are HTTP
status codes describing the result of the creation (201, 409, etc.). E.g. for
the above example the following would be a response:
{
"environment": {
"/t;tenant/e;env1": 201,
"/t;tenant/e;env2": 201
},
"resourceType": {
"/t;tenant/rt;URL": 201
}
"metricType": {
"/t;tenant/mt;ResponseTime": 201
},
"data": {
"/t;tenant/rt;URL/d;configurationSchema": 201,
"/t;tenant/e;env1/r;url1/d;configuration": 201
},
"operationType": {
"/t;tenant/rt;URL/ot;ping": 201
},
"resource": {
"/t;tenant/e;env1/r;url1": 201
},
"metric": {
"/t;tenant/e;env1/m;url1_responseTime": 201
},
"relationship": {
"<some-random-id>": 201
}
}
Hope you will find this useful,
Lukas
[1] http://www.hawkular.org/docs/components/inventory/index.html#inventory-organization
More information about the hawkular-dev
mailing list