You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by mf...@redhat.com on 2012/05/15 17:15:44 UTC
[PATCH core 12/26] CIMI: Moved code from CIMI server.rb and split it to smaller collections like in Deltacloud
From: Michal Fojtik <mf...@redhat.com>
Signed-off-by: Michal fojtik <mf...@redhat.com>
---
server/lib/cimi/collections.rb | 58 ++
server/lib/cimi/collections/address_templates.rb | 49 +
server/lib/cimi/collections/addresses.rb | 74 ++
server/lib/cimi/collections/cloud_entry_point.rb | 32 +
server/lib/cimi/collections/entity_metadata.rb | 48 +
server/lib/cimi/collections/machine_admins.rb | 74 ++
.../lib/cimi/collections/machine_configurations.rb | 49 +
server/lib/cimi/collections/machine_images.rb | 50 +
server/lib/cimi/collections/machines.rb | 157 ++++
.../lib/cimi/collections/network_configurations.rb | 47 +
server/lib/cimi/collections/network_templates.rb | 48 +
server/lib/cimi/collections/networks.rb | 125 +++
.../cimi/collections/routing_group_templates.rb | 47 +
server/lib/cimi/collections/routing_groups.rb | 48 +
.../lib/cimi/collections/volume_configurations.rb | 48 +
server/lib/cimi/collections/volume_images.rb | 50 +
server/lib/cimi/collections/volumes.rb | 80 ++
server/lib/cimi/collections/vsp_configurations.rb | 48 +
server/lib/cimi/collections/vsp_templates.rb | 50 +
server/lib/cimi/collections/vsps.rb | 108 +++
server/lib/cimi/helpers.rb | 104 +++
server/lib/cimi/model.rb | 67 --
server/lib/cimi/model/action.rb | 24 -
server/lib/cimi/model/address.rb | 72 --
server/lib/cimi/model/address_collection.rb | 34 -
server/lib/cimi/model/address_template.rb | 54 --
.../lib/cimi/model/address_template_collection.rb | 34 -
server/lib/cimi/model/base.rb | 249 -----
server/lib/cimi/model/cloud_entry_point.rb | 48 -
server/lib/cimi/model/entity_metadata.rb | 83 --
.../lib/cimi/model/entity_metadata_collection.rb | 31 -
server/lib/cimi/model/errors.rb | 48 -
server/lib/cimi/model/machine.rb | 229 -----
server/lib/cimi/model/machine_admin.rb | 59 --
server/lib/cimi/model/machine_admin_collection.rb | 34 -
server/lib/cimi/model/machine_collection.rb | 34 -
server/lib/cimi/model/machine_configuration.rb | 70 --
.../cimi/model/machine_configuration_collection.rb | 34 -
server/lib/cimi/model/machine_image.rb | 46 -
server/lib/cimi/model/machine_image_collection.rb | 34 -
server/lib/cimi/model/machine_template.rb | 41 -
.../lib/cimi/model/machine_template_collection.rb | 34 -
server/lib/cimi/model/network.rb | 106 ---
server/lib/cimi/model/network_collection.rb | 34 -
server/lib/cimi/model/network_configuration.rb | 49 -
.../cimi/model/network_configuration_collection.rb | 34 -
server/lib/cimi/model/network_template.rb | 36 -
.../lib/cimi/model/network_template_collection.rb | 35 -
server/lib/cimi/model/routing_group.rb | 34 -
server/lib/cimi/model/routing_group_collection.rb | 34 -
server/lib/cimi/model/routing_group_template.rb | 34 -
.../model/routing_group_template_collection.rb | 35 -
server/lib/cimi/model/schema.rb | 277 ------
server/lib/cimi/model/volume.rb | 103 ---
server/lib/cimi/model/volume_collection.rb | 34 -
server/lib/cimi/model/volume_configuration.rb | 60 --
.../cimi/model/volume_configuration_collection.rb | 34 -
server/lib/cimi/model/volume_image.rb | 49 -
server/lib/cimi/model/volume_image_collection.rb | 34 -
server/lib/cimi/model/volume_template.rb | 23 -
.../lib/cimi/model/volume_template_collection.rb | 34 -
server/lib/cimi/model/vsp.rb | 102 ---
server/lib/cimi/model/vsp_collection.rb | 34 -
server/lib/cimi/model/vsp_configuration.rb | 40 -
.../lib/cimi/model/vsp_configuration_collection.rb | 34 -
server/lib/cimi/model/vsp_template.rb | 34 -
server/lib/cimi/model/vsp_template_collection.rb | 34 -
server/lib/cimi/models.rb | 75 ++
server/lib/cimi/models/action.rb | 24 +
server/lib/cimi/models/address.rb | 72 ++
server/lib/cimi/models/address_collection.rb | 34 +
server/lib/cimi/models/address_template.rb | 54 ++
.../lib/cimi/models/address_template_collection.rb | 34 +
server/lib/cimi/models/base.rb | 249 +++++
server/lib/cimi/models/cloud_entry_point.rb | 46 +
server/lib/cimi/models/entity_metadata.rb | 84 ++
.../lib/cimi/models/entity_metadata_collection.rb | 31 +
server/lib/cimi/models/errors.rb | 48 +
server/lib/cimi/models/machine.rb | 227 +++++
server/lib/cimi/models/machine_admin.rb | 59 ++
server/lib/cimi/models/machine_admin_collection.rb | 34 +
server/lib/cimi/models/machine_collection.rb | 34 +
server/lib/cimi/models/machine_configuration.rb | 70 ++
.../models/machine_configuration_collection.rb | 34 +
server/lib/cimi/models/machine_image.rb | 46 +
server/lib/cimi/models/machine_image_collection.rb | 34 +
server/lib/cimi/models/machine_template.rb | 41 +
.../lib/cimi/models/machine_template_collection.rb | 34 +
server/lib/cimi/models/network.rb | 109 +++
server/lib/cimi/models/network_collection.rb | 34 +
server/lib/cimi/models/network_configuration.rb | 49 +
.../models/network_configuration_collection.rb | 34 +
server/lib/cimi/models/network_template.rb | 36 +
.../lib/cimi/models/network_template_collection.rb | 35 +
server/lib/cimi/models/routing_group.rb | 34 +
server/lib/cimi/models/routing_group_collection.rb | 34 +
server/lib/cimi/models/routing_group_template.rb | 34 +
.../models/routing_group_template_collection.rb | 35 +
server/lib/cimi/models/schema.rb | 277 ++++++
server/lib/cimi/models/volume.rb | 103 +++
server/lib/cimi/models/volume_collection.rb | 34 +
server/lib/cimi/models/volume_configuration.rb | 60 ++
.../cimi/models/volume_configuration_collection.rb | 34 +
server/lib/cimi/models/volume_image.rb | 49 +
server/lib/cimi/models/volume_image_collection.rb | 34 +
server/lib/cimi/models/volume_template.rb | 23 +
.../lib/cimi/models/volume_template_collection.rb | 34 +
server/lib/cimi/models/vsp.rb | 102 +++
server/lib/cimi/models/vsp_collection.rb | 34 +
server/lib/cimi/models/vsp_configuration.rb | 40 +
.../cimi/models/vsp_configuration_collection.rb | 34 +
server/lib/cimi/models/vsp_template.rb | 34 +
server/lib/cimi/models/vsp_template_collection.rb | 34 +
server/lib/cimi/server.rb | 959 +-------------------
114 files changed, 4148 insertions(+), 3645 deletions(-)
create mode 100644 server/lib/cimi/collections.rb
create mode 100644 server/lib/cimi/collections/address_templates.rb
create mode 100644 server/lib/cimi/collections/addresses.rb
create mode 100644 server/lib/cimi/collections/cloud_entry_point.rb
create mode 100644 server/lib/cimi/collections/entity_metadata.rb
create mode 100644 server/lib/cimi/collections/machine_admins.rb
create mode 100644 server/lib/cimi/collections/machine_configurations.rb
create mode 100644 server/lib/cimi/collections/machine_images.rb
create mode 100644 server/lib/cimi/collections/machines.rb
create mode 100644 server/lib/cimi/collections/network_configurations.rb
create mode 100644 server/lib/cimi/collections/network_templates.rb
create mode 100644 server/lib/cimi/collections/networks.rb
create mode 100644 server/lib/cimi/collections/routing_group_templates.rb
create mode 100644 server/lib/cimi/collections/routing_groups.rb
create mode 100644 server/lib/cimi/collections/volume_configurations.rb
create mode 100644 server/lib/cimi/collections/volume_images.rb
create mode 100644 server/lib/cimi/collections/volumes.rb
create mode 100644 server/lib/cimi/collections/vsp_configurations.rb
create mode 100644 server/lib/cimi/collections/vsp_templates.rb
create mode 100644 server/lib/cimi/collections/vsps.rb
create mode 100644 server/lib/cimi/helpers.rb
delete mode 100644 server/lib/cimi/model.rb
delete mode 100644 server/lib/cimi/model/action.rb
delete mode 100644 server/lib/cimi/model/address.rb
delete mode 100644 server/lib/cimi/model/address_collection.rb
delete mode 100644 server/lib/cimi/model/address_template.rb
delete mode 100644 server/lib/cimi/model/address_template_collection.rb
delete mode 100644 server/lib/cimi/model/base.rb
delete mode 100644 server/lib/cimi/model/cloud_entry_point.rb
delete mode 100644 server/lib/cimi/model/entity_metadata.rb
delete mode 100644 server/lib/cimi/model/entity_metadata_collection.rb
delete mode 100644 server/lib/cimi/model/errors.rb
delete mode 100644 server/lib/cimi/model/machine.rb
delete mode 100644 server/lib/cimi/model/machine_admin.rb
delete mode 100644 server/lib/cimi/model/machine_admin_collection.rb
delete mode 100644 server/lib/cimi/model/machine_collection.rb
delete mode 100644 server/lib/cimi/model/machine_configuration.rb
delete mode 100644 server/lib/cimi/model/machine_configuration_collection.rb
delete mode 100644 server/lib/cimi/model/machine_image.rb
delete mode 100644 server/lib/cimi/model/machine_image_collection.rb
delete mode 100644 server/lib/cimi/model/machine_template.rb
delete mode 100644 server/lib/cimi/model/machine_template_collection.rb
delete mode 100644 server/lib/cimi/model/network.rb
delete mode 100644 server/lib/cimi/model/network_collection.rb
delete mode 100644 server/lib/cimi/model/network_configuration.rb
delete mode 100644 server/lib/cimi/model/network_configuration_collection.rb
delete mode 100644 server/lib/cimi/model/network_template.rb
delete mode 100644 server/lib/cimi/model/network_template_collection.rb
delete mode 100644 server/lib/cimi/model/routing_group.rb
delete mode 100644 server/lib/cimi/model/routing_group_collection.rb
delete mode 100644 server/lib/cimi/model/routing_group_template.rb
delete mode 100644 server/lib/cimi/model/routing_group_template_collection.rb
delete mode 100644 server/lib/cimi/model/schema.rb
delete mode 100644 server/lib/cimi/model/volume.rb
delete mode 100644 server/lib/cimi/model/volume_collection.rb
delete mode 100644 server/lib/cimi/model/volume_configuration.rb
delete mode 100644 server/lib/cimi/model/volume_configuration_collection.rb
delete mode 100644 server/lib/cimi/model/volume_image.rb
delete mode 100644 server/lib/cimi/model/volume_image_collection.rb
delete mode 100644 server/lib/cimi/model/volume_template.rb
delete mode 100644 server/lib/cimi/model/volume_template_collection.rb
delete mode 100644 server/lib/cimi/model/vsp.rb
delete mode 100644 server/lib/cimi/model/vsp_collection.rb
delete mode 100644 server/lib/cimi/model/vsp_configuration.rb
delete mode 100644 server/lib/cimi/model/vsp_configuration_collection.rb
delete mode 100644 server/lib/cimi/model/vsp_template.rb
delete mode 100644 server/lib/cimi/model/vsp_template_collection.rb
create mode 100644 server/lib/cimi/models.rb
create mode 100644 server/lib/cimi/models/action.rb
create mode 100644 server/lib/cimi/models/address.rb
create mode 100644 server/lib/cimi/models/address_collection.rb
create mode 100644 server/lib/cimi/models/address_template.rb
create mode 100644 server/lib/cimi/models/address_template_collection.rb
create mode 100644 server/lib/cimi/models/base.rb
create mode 100644 server/lib/cimi/models/cloud_entry_point.rb
create mode 100644 server/lib/cimi/models/entity_metadata.rb
create mode 100644 server/lib/cimi/models/entity_metadata_collection.rb
create mode 100644 server/lib/cimi/models/errors.rb
create mode 100644 server/lib/cimi/models/machine.rb
create mode 100644 server/lib/cimi/models/machine_admin.rb
create mode 100644 server/lib/cimi/models/machine_admin_collection.rb
create mode 100644 server/lib/cimi/models/machine_collection.rb
create mode 100644 server/lib/cimi/models/machine_configuration.rb
create mode 100644 server/lib/cimi/models/machine_configuration_collection.rb
create mode 100644 server/lib/cimi/models/machine_image.rb
create mode 100644 server/lib/cimi/models/machine_image_collection.rb
create mode 100644 server/lib/cimi/models/machine_template.rb
create mode 100644 server/lib/cimi/models/machine_template_collection.rb
create mode 100644 server/lib/cimi/models/network.rb
create mode 100644 server/lib/cimi/models/network_collection.rb
create mode 100644 server/lib/cimi/models/network_configuration.rb
create mode 100644 server/lib/cimi/models/network_configuration_collection.rb
create mode 100644 server/lib/cimi/models/network_template.rb
create mode 100644 server/lib/cimi/models/network_template_collection.rb
create mode 100644 server/lib/cimi/models/routing_group.rb
create mode 100644 server/lib/cimi/models/routing_group_collection.rb
create mode 100644 server/lib/cimi/models/routing_group_template.rb
create mode 100644 server/lib/cimi/models/routing_group_template_collection.rb
create mode 100644 server/lib/cimi/models/schema.rb
create mode 100644 server/lib/cimi/models/volume.rb
create mode 100644 server/lib/cimi/models/volume_collection.rb
create mode 100644 server/lib/cimi/models/volume_configuration.rb
create mode 100644 server/lib/cimi/models/volume_configuration_collection.rb
create mode 100644 server/lib/cimi/models/volume_image.rb
create mode 100644 server/lib/cimi/models/volume_image_collection.rb
create mode 100644 server/lib/cimi/models/volume_template.rb
create mode 100644 server/lib/cimi/models/volume_template_collection.rb
create mode 100644 server/lib/cimi/models/vsp.rb
create mode 100644 server/lib/cimi/models/vsp_collection.rb
create mode 100644 server/lib/cimi/models/vsp_configuration.rb
create mode 100644 server/lib/cimi/models/vsp_configuration_collection.rb
create mode 100644 server/lib/cimi/models/vsp_template.rb
create mode 100644 server/lib/cimi/models/vsp_template_collection.rb
diff --git a/server/lib/cimi/collections.rb b/server/lib/cimi/collections.rb
new file mode 100644
index 0000000..b675fc4
--- /dev/null
+++ b/server/lib/cimi/collections.rb
@@ -0,0 +1,58 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI
+
+ def self.collection_names
+ @collections.map { |c| c.collection_name }
+ end
+
+ def self.collections
+ @collections ||= []
+ end
+
+ module Collections
+
+ def self.collection(name)
+ CIMI.collections.find { |c| c.collection_name == name }
+ end
+
+ def self.cimi_modules
+ @cimi_modules ||= []
+ end
+
+ Dir[File.join(File::dirname(__FILE__), "collections", "*.rb")].each do |collection|
+ require collection
+ base_collection_name = File.basename(collection).gsub('.rb', '')
+ cimi_module_class = CIMI::Collections.const_get(base_collection_name.camelize)
+ cimi_modules << cimi_module_class
+ unless cimi_module_class.collections.nil?
+ cimi_module_class.collections.each do |c|
+ CIMI.collections << c
+ end
+ else
+ warn "WARNING: File %s placed in collections directory but does not have any collections defined" % base_collection_name
+ end
+ end
+
+ def self.included(klass)
+ klass.class_eval do
+ CIMI::Collections.cimi_modules.each { |c| use c }
+ end
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/address_templates.rb b/server/lib/cimi/collections/address_templates.rb
new file mode 100644
index 0000000..db59507
--- /dev/null
+++ b/server/lib/cimi/collections/address_templates.rb
@@ -0,0 +1,49 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class AddressTemplates < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+
+ collection :address_templates do
+
+ operation :index do
+ description 'List all AddressTemplates in the AddressTemplateCollection'
+ param :CIMISelect, :string, :optional
+ control do
+ address_templates = AddressTemplateCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml {address_templates.to_xml}
+ format.json {address_templates.to_json}
+ end
+ end
+ end
+
+ operation :show do
+ description 'Show a specific AddressTemplate'
+ control do
+ address_template = CIMI::Model::AddressTemplate.find(params[:id], self)
+ respond_to do |format|
+ format.xml {address_template.to_xml}
+ format.json {address_template.to_json}
+ end
+ end
+ end
+
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/addresses.rb b/server/lib/cimi/collections/addresses.rb
new file mode 100644
index 0000000..96871c1
--- /dev/null
+++ b/server/lib/cimi/collections/addresses.rb
@@ -0,0 +1,74 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class Addresses < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+ collection :addresses do
+
+ description 'An Address represents an IP address, and its associated metdata, for a particular Network.'
+
+ operation :index do
+ description 'List all Addresses in the AddressCollection'
+ param :CIMISelect, :string, :optional
+ control do
+ addresses = AddressCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml {addresses.to_xml}
+ format.json {addresses.to_json}
+ end
+ end
+ end
+
+ operation :show do
+ description 'Show a specific Address'
+ control do
+ address = CIMI::Model::Address.find(params[:id], self)
+ respond_to do |format|
+ format.xml {address.to_xml}
+ format.json {address.to_json}
+ end
+ end
+ end
+
+ operation :create do
+ description "Create a new Address"
+ control do
+ if request.content_type.end_with?("json")
+ address = CIMI::Model::Address.create(request.body.read, self, :json)
+ else
+ address = CIMI::Model::Address.create(request.body.read, self, :xml)
+ end
+ respond_to do |format|
+ format.xml { address.to_xml }
+ format.json { address.to_json }
+ end
+ end
+ end
+
+ operation :destroy do
+ description "Delete a specified Address"
+ param :id, :string, :required
+ control do
+ CIMI::Model::Address.delete!(params[:id], self)
+ no_content_with_status(200)
+ end
+ end
+
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/cloud_entry_point.rb b/server/lib/cimi/collections/cloud_entry_point.rb
new file mode 100644
index 0000000..79454f3
--- /dev/null
+++ b/server/lib/cimi/collections/cloud_entry_point.rb
@@ -0,0 +1,32 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class CloudEntryPoint < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+
+ collection :cloudEntryPoint do
+ description 'Cloud entry point'
+ operation :index do
+ description "list all resources of the cloud"
+ control do
+ redirect API_ROOT_URL
+ end
+ end
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/entity_metadata.rb b/server/lib/cimi/collections/entity_metadata.rb
new file mode 100644
index 0000000..84e1fec
--- /dev/null
+++ b/server/lib/cimi/collections/entity_metadata.rb
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class EntityMetadata < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+
+ collection :entity_metadata do
+
+ operation :index do
+ description "List all entity metadata defined for this provider"
+ control do
+ entity_metadata = CIMI::Model::EntityMetadataCollection.default(self)
+ respond_to do |format|
+ format.xml{entity_metadata.to_xml}
+ format.json{entity_metadata.to_json}
+ end
+ end
+ end
+
+ operation :show do
+ description "Get the entity metadata for a specific collection"
+ control do
+ entity_metadata = EntityMetadata.find(params[:id], self)
+ respond_to do |format|
+ format.xml{entity_metadata.to_xml}
+ format.json{entity_metadata.to_json}
+ end
+ end
+ end
+
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/machine_admins.rb b/server/lib/cimi/collections/machine_admins.rb
new file mode 100644
index 0000000..c413cc9
--- /dev/null
+++ b/server/lib/cimi/collections/machine_admins.rb
@@ -0,0 +1,74 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class MachineAdmins < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+
+ collection :machine_admins do
+ description 'Machine Admin entity'
+
+ operation :index do
+ description "List all machine admins"
+ param :CIMISelect, :string, :optional
+ control do
+ machine_admins = MachineAdminCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml { machine_admins.to_xml }
+ format.json { machine_admins.to_json }
+ end
+ end
+ end
+
+ operation :show do
+ description "Show specific machine admin"
+ control do
+ machine_admin = MachineAdmin.find(params[:id], self)
+ respond_to do |format|
+ format.xml { machine_admin.to_xml }
+ format.json { machine_admin.to_json }
+ end
+ end
+ end
+
+ operation :create do
+ description "Show specific machine admin"
+ control do
+ if request.content_type.end_with?("+json")
+ new_admin = MachineAdmin.create_from_json(request.body.read, self)
+ else
+ new_admin = MachineAdmin.create_from_xml(request.body.read, self)
+ end
+ status 201 # Created
+ respond_to do |format|
+ format.json { new_admin.to_json }
+ format.xml { new_admin.to_xml }
+ end
+ end
+ end
+
+ operation :delete do
+ description "Delete specified MachineAdmin entity"
+ control do
+ MachineAdmin.delete!(params[:id], self)
+ no_content_with_status(200)
+ end
+ end
+
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/machine_configurations.rb b/server/lib/cimi/collections/machine_configurations.rb
new file mode 100644
index 0000000..5b09e6a
--- /dev/null
+++ b/server/lib/cimi/collections/machine_configurations.rb
@@ -0,0 +1,49 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class MachineConfigurations < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+
+ collection :machine_configurations do
+ description 'List all machine configurations'
+
+ operation :index do
+ param :CIMISelect, :string, :optional
+ description "List all machine configurations"
+ control do
+ machine_configs = MachineConfigurationCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml { machine_configs.to_xml }
+ format.json { machine_configs.to_json }
+ end
+ end
+ end
+
+ operation :show do
+ control do
+ machine_conf = MachineConfiguration.find(params[:id], self)
+ respond_to do |format|
+ format.xml { machine_conf.to_xml }
+ format.json { machine_conf.to_json }
+ end
+ end
+
+ end
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/machine_images.rb b/server/lib/cimi/collections/machine_images.rb
new file mode 100644
index 0000000..1296279
--- /dev/null
+++ b/server/lib/cimi/collections/machine_images.rb
@@ -0,0 +1,50 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class MachineImages < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+
+ collection :machine_images do
+ description 'List all machine images'
+
+ operation :index do
+ description "List all machine configurations"
+ param :CIMISelect, :string, :optional
+ control do
+ machine_images = MachineImageCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml { machine_images.to_xml }
+ format.json { machine_images.to_json }
+ end
+ end
+ end
+
+ operation :show do
+ description "Show specific machine image."
+ control do
+ machine_image = MachineImage.find(params[:id], self)
+ respond_to do |format|
+ format.xml { machine_image.to_xml }
+ format.json { machine_image.to_json }
+ end
+ end
+ end
+
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/machines.rb b/server/lib/cimi/collections/machines.rb
new file mode 100644
index 0000000..0abf63a
--- /dev/null
+++ b/server/lib/cimi/collections/machines.rb
@@ -0,0 +1,157 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class Machines < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+
+ collection :machines do
+ description 'List all machine'
+
+ operation :index do
+ param :CIMISelect, :string, :optional
+ description "List all machines"
+ control do
+ machines = MachineCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml { machines.to_xml }
+ format.json { machines.to_json }
+ end
+ end
+ end
+
+ operation :show do
+ description "Show specific machine."
+ control do
+ machine = Machine.find(params[:id], self)
+ respond_to do |format|
+ format.xml { machine.to_xml }
+ format.json { machine.to_json }
+ end
+ end
+ end
+
+ operation :create do
+ description "Create a new Machine entity."
+ control do
+ if request.content_type.end_with?("+json")
+ new_machine = Machine.create_from_json(request.body.read, self)
+ else
+ new_machine = Machine.create_from_xml(request.body.read, self)
+ end
+ status 201 # Created
+ respond_to do |format|
+ format.json { new_machine.to_json }
+ format.xml { new_machine.to_xml }
+ end
+ end
+ end
+
+ operation :destroy do
+ description "Delete a specified machine."
+ param :id, :string, :required
+ control do
+ Machine.delete!(params[:id], self)
+ no_content_with_status(200)
+ end
+ end
+
+ action :stop do
+ description "Stop specific machine."
+ control do
+ machine = Machine.find(params[:id], self)
+ if request.content_type.end_with?("+json")
+ action = Action.from_json(request.body.read)
+ else
+ action = Action.from_xml(request.body.read)
+ end
+ machine.perform(action, self) do |operation|
+ no_content_with_status(202) if operation.success?
+ # Handle errors using operation.failure?
+ end
+ end
+ end
+
+ operation :restart do
+ description "Start specific machine."
+ control do
+ machine = Machine.find(params[:id], self)
+ if request.content_type.end_with?("+json")
+ action = Action.from_json(request.body.read)
+ else
+ action = Action.from_xml(request.body.read)
+ end
+ machine.perform(action, self) do |operation|
+ no_content_with_status(202) if operation.success?
+ # Handle errors using operation.failure?
+ end
+ end
+ end
+
+ operation :start do
+ description "Start specific machine."
+ control do
+ machine = Machine.find(params[:id], self)
+ if request.content_type.end_with?("+json")
+ action = Action.from_json(request.body.read)
+ else
+ action = Action.from_xml(request.body.read)
+ end
+ machine.perform(action, self) do |operation|
+ no_content_with_status(202) if operation.success?
+ # Handle errors using operation.failure?
+ end
+ end
+ end
+
+ #NOTE: The routes for attach/detach used here are NOT as specified by CIMI
+ #will likely move later. CIMI specifies PUT of the whole Machine description
+ #with inclusion/ommission of the volumes you want [att|det]ached
+ action :attach_volume, :http_method => :put do
+ description "Attach CIMI Volume(s) to a machine."
+ control do
+ if request.content_type.end_with?("+json")
+ volumes_to_attach = Volume.find_to_attach_from_json(request.body.read, self)
+ else
+ volumes_to_attach = Volume.find_to_attach_from_xml(request.body.read, self)
+ end
+ machine = Machine.attach_volumes(volumes_to_attach, self)
+ respond_to do |format|
+ format.json{ machine.to_json}
+ format.xml{machine.to_xml}
+ end
+ end
+ end
+
+ action :detach_volume, :http_method => :put do
+ description "Detach CIMI Volume(s) from a machine."
+ control do
+ if request.content_type.end_with?("+json")
+ volumes_to_detach = Volume.find_to_attach_from_json(request.body.read, self)
+ else
+ volumes_to_detach = Volume.find_to_attach_from_xml(request.body.read, self)
+ end
+ machine = Machine.detach_volumes(volumes_to_detach, self)
+ respond_to do |format|
+ format.json{ machine.to_json}
+ format.xml{machine.to_xml}
+ end
+ end
+ end
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/network_configurations.rb b/server/lib/cimi/collections/network_configurations.rb
new file mode 100644
index 0000000..02452a8
--- /dev/null
+++ b/server/lib/cimi/collections/network_configurations.rb
@@ -0,0 +1,47 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class NetworkConfigurations < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+ collection :network_configurations do
+
+ operation :index do
+ description 'List all NetworkConfigurations'
+ param :CIMISelect, :string, :optional
+ control do
+ network_configurations = NetworkConfigurationCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml { network_configurations.to_xml }
+ format.json { network_configurations.to_json }
+ end
+ end
+ end
+
+ operation :show do
+ description 'Show a specific NetworkConfiguration'
+ control do
+ network_config = NetworkConfiguration.find(params[:id], self)
+ respond_to do |format|
+ format.xml { network_config.to_xml }
+ format.json { network_config.to_json }
+ end
+ end
+ end
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/network_templates.rb b/server/lib/cimi/collections/network_templates.rb
new file mode 100644
index 0000000..0ff82b2
--- /dev/null
+++ b/server/lib/cimi/collections/network_templates.rb
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class NetworkTemplates < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+ collection :network_templates do
+
+ operation :index do
+ description 'List all Network Templates in the NetworkTemplateCollection'
+ param :CIMISelect, :string, :optional
+ control do
+ network_templates = NetworkTemplateCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml {network_templates.to_xml}
+ format.json {network_templates.to_json}
+ end
+ end
+ end
+
+ operation :show do
+ description 'Show a specific Network Template'
+ control do
+ network_template = NetworkTemplate.find(params[:id], self)
+ respond_to do |format|
+ format.xml {network_template.to_xml}
+ format.json {network_template.to_json}
+ end
+ end
+ end
+
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/networks.rb b/server/lib/cimi/collections/networks.rb
new file mode 100644
index 0000000..0aa21e8
--- /dev/null
+++ b/server/lib/cimi/collections/networks.rb
@@ -0,0 +1,125 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class Networks < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+
+ collection :networks do
+ description 'A Network represents an abstraction of a layer 2 broadcast domain'
+
+ operation :index do
+ description "List all Networks"
+ param :CIMISelect, :string, :optional
+ control do
+ networks = NetworkCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml { networks.to_xml }
+ format.json { networks.to_json }
+ end
+ end
+ end
+
+ operation :show do
+ description "Show a specific Network"
+ control do
+ network = Network.find(params[:id], self)
+ respond_to do |format|
+ format.xml { network.to_xml }
+ format.json { network.to_json }
+ end
+ end
+ end
+
+ operation :create do
+ description "Create a new Network"
+ control do
+ if request.content_type.end_with?("json")
+ network = Network.create(request.body.read, self, :json)
+ else
+ network = Network.create(request.body.read, self, :xml)
+ end
+ respond_to do |format|
+ format.xml { network.to_xml}
+ format.json { network.to_json }
+ end
+ end
+ end
+
+ operation :destroy do
+ description "Delete a specified Network"
+ param :id, :string, :required
+ control do
+ Network.delete!(params[:id], self)
+ no_content_with_status(200)
+ end
+ end
+
+ action :start do
+ description "Start specific network."
+ control do
+ network = Network.find(params[:id], self)
+ report_error(404) unless network
+ if request.content_type.end_with?("json")
+ action = Action.from_json(request.body.read)
+ else
+ action = Action.from_xml(request.body.read)
+ end
+ network.perform(action, self) do |operation|
+ no_content_with_status(202) if operation.success?
+ # Handle errors using operation.failure?
+ end
+ end
+ end
+
+ action :stop do
+ description "Stop specific network."
+ control do
+ network = Network.find(params[:id], self)
+ report_error(404) unless network
+ if request.content_type.end_with?("json")
+ action = Action.from_json(request.body.read)
+ else
+ action = Action.from_xml(request.body.read)
+ end
+ network.perform(action, self) do |operation|
+ no_content_with_status(202) if operation.success?
+ # Handle errors using operation.failure?
+ end
+ end
+ end
+
+ action :suspend do
+ description "Suspend specific network."
+ control do
+ network = Network.find(params[:id], self)
+ report_error(404) unless network
+ if request.content_type.end_with?("json")
+ action = Action.from_json(request.body.read)
+ else
+ action = Action.from_xml(request.body.read)
+ end
+ network.perform(action, self) do |operation|
+ no_content_with_status(202) if operation.success?
+ # Handle errors using operation.failure?
+ end
+ end
+ end
+
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/routing_group_templates.rb b/server/lib/cimi/collections/routing_group_templates.rb
new file mode 100644
index 0000000..995b1f8
--- /dev/null
+++ b/server/lib/cimi/collections/routing_group_templates.rb
@@ -0,0 +1,47 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class RoutingGroupTemplates < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+ collection :routing_group_templates do
+
+ operation :index do
+ description 'List all RoutingGroupTemplates in the RoutingGroupTemplateCollection'
+ param :CIMISelect, :string, :optional
+ control do
+ routing_group_templates = RoutingGroupTemplateCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml {routing_group_templates.to_xml}
+ format.json {routing_group_templates.to_json}
+ end
+ end
+ end
+
+ operation :show do
+ description 'Show a specific RoutingGroupTemplate'
+ control do
+ routing_group_template = RoutingGroupTemplate.find(params[:id], self)
+ respond_to do |format|
+ format.xml {routing_group_template.to_xml}
+ format.json {routing_group_template.to_json}
+ end
+ end
+ end
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/routing_groups.rb b/server/lib/cimi/collections/routing_groups.rb
new file mode 100644
index 0000000..5e7ccc5
--- /dev/null
+++ b/server/lib/cimi/collections/routing_groups.rb
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class RoutingGroups < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+ collection :routing_groups do
+
+ operation :index do
+ description 'List all RoutingGroups in the RoutingGroupsCollection'
+ param :CIMISelect, :string, :optional
+ control do
+ routing_groups = RoutingGroupCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml {routing_groups.to_xml}
+ format.json {routing_groups.to_json}
+ end
+ end
+ end
+
+ operation :show do
+ description 'Show a specific RoutingGroup'
+ control do
+ routing_group = RoutingGroup.find(params[:id], self)
+ respond_to do |format|
+ format.xml {routing_group.to_xml}
+ format.json {routing_group.to_json}
+ end
+ end
+ end
+
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/volume_configurations.rb b/server/lib/cimi/collections/volume_configurations.rb
new file mode 100644
index 0000000..055e28c
--- /dev/null
+++ b/server/lib/cimi/collections/volume_configurations.rb
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class VolumeConfigurations < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+
+ collection :volume_configurations do
+
+ operation :index do
+ description "Get list all VolumeConfigurations"
+ param :CIMISelect, :string, :optional
+ control do
+ volume_configuration = VolumeConfigurationCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml { volume_configuration.to_xml }
+ format.json { volume_configuration.to_json }
+ end
+ end
+ end
+
+ operation :show do
+ description "Get a specific VolumeConfiguration"
+ control do
+ volume_config = VolumeConfiguration.find(params[:id], self)
+ respond_to do |format|
+ format.xml { volume_config.to_xml }
+ format.json { volume_config.json }
+ end
+ end
+ end
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/volume_images.rb b/server/lib/cimi/collections/volume_images.rb
new file mode 100644
index 0000000..78432b1
--- /dev/null
+++ b/server/lib/cimi/collections/volume_images.rb
@@ -0,0 +1,50 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class VolumeImages < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+
+ collection :volume_images do
+ description 'This entity represents an image that could be place on a pre-loaded volume.'
+
+ operation :index do
+ description "List all volumes images"
+ param :CIMISelect, :string, :optional
+ control do
+ volume_images = VolumeImageCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml { volume_images.to_xml }
+ format.json { volume_images.to_json }
+ end
+ end
+ end
+
+ operation :show do
+ description "Show a specific volume image"
+ control do
+ volume_image = VolumeImage.find(params[:id], self)
+ respond_to do |format|
+ format.xml { volume_image.to_xml }
+ format.json { volume_image.to_json }
+ end
+ end
+ end
+ end
+
+
+ end
+end
diff --git a/server/lib/cimi/collections/volumes.rb b/server/lib/cimi/collections/volumes.rb
new file mode 100644
index 0000000..1c45c9e
--- /dev/null
+++ b/server/lib/cimi/collections/volumes.rb
@@ -0,0 +1,80 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class Volumes < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+ collection :volumes do
+
+ operation :index do
+ description "List all volumes"
+ param :CIMISelect, :string, :optional
+ control do
+ volumes = VolumeCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml { volumes.to_xml }
+ format.json { volumes.to_json }
+ end
+ end
+ end
+
+ operation :show do
+ description "Show specific Volume."
+ control do
+ volume = Volume.find(params[:id], self)
+ if volume
+ respond_to do |format|
+ format.xml { volume.to_xml }
+ format.json { volume.to_json }
+ end
+ else
+ report_error(404)
+ end
+ end
+ end
+
+ operation :create do
+ description "Create a new Volume."
+ control do
+ content_type = (request.content_type.end_with?("+json") ? :json : :xml)
+ #((request.content_type.end_with?("+xml")) ? :xml : report_error(415) ) FIXME
+ case content_type
+ when :json
+ new_volume = Volume.create_from_json(request.body.read, self)
+ when :xml
+ new_volume = Volume.create_from_xml(request.body.read, self)
+ end
+ respond_to do |format|
+ format.json { new_volume.to_json }
+ format.xml { new_volume.to_xml }
+ end
+ end
+ end
+
+ operation :destroy do
+ description "Delete a specified Volume"
+ param :id, :string, :required
+ control do
+ Volume.delete!(params[:id], self)
+ no_content_with_status(200)
+ end
+ end
+
+ end
+
+
+ end
+end
diff --git a/server/lib/cimi/collections/vsp_configurations.rb b/server/lib/cimi/collections/vsp_configurations.rb
new file mode 100644
index 0000000..31acceb
--- /dev/null
+++ b/server/lib/cimi/collections/vsp_configurations.rb
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class VspConfigurations < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+ collection :vsp_configurations do
+
+ operation :index do
+ description 'List all VSPConfigurations in the VSPConfigurationCollection'
+ param :CIMISelect, :string, :optional
+ control do
+ vsp_configs = VSPConfigurationCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml {vsp_configs.to_xml}
+ format.json {vsp_configs.to_json}
+ end
+ end
+ end
+
+ operation :show do
+ description 'Show a specific VSPConfiguration'
+ control do
+ vsp_config = VSPConfiguration.find(params[:id], self)
+ respond_to do |format|
+ format.xml {vsp_config.to_xml}
+ format.json {vsp_config.to_json}
+ end
+ end
+ end
+
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/vsp_templates.rb b/server/lib/cimi/collections/vsp_templates.rb
new file mode 100644
index 0000000..503de50
--- /dev/null
+++ b/server/lib/cimi/collections/vsp_templates.rb
@@ -0,0 +1,50 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class VspTemplates < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+ collection :vsp_templates do
+
+ description 'The VSP Template is a set of Configuration values for realizing a VSP. A VSP Template may be used to create multiple VSPs'
+
+ operation :index do
+ description 'List all VSPTemplates in the VSPTemplateCollection'
+ param :CIMISelect, :string, :optional
+ control do
+ vsp_templates = VSPTemplateCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml {vsp_templates.to_xml}
+ format.json {vsp_templates.to_json}
+ end
+ end
+ end
+
+ operation :show do
+ description 'Show a specific VSPTemplate'
+ control do
+ vsp_template = VSPTemplate.find(params[:id], self)
+ respond_to do |format|
+ format.xml {vsp_template.to_xml}
+ format.json {vsp_template.to_json}
+ end
+ end
+ end
+
+ end
+
+ end
+end
diff --git a/server/lib/cimi/collections/vsps.rb b/server/lib/cimi/collections/vsps.rb
new file mode 100644
index 0000000..52b1a5a
--- /dev/null
+++ b/server/lib/cimi/collections/vsps.rb
@@ -0,0 +1,108 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Collections
+ class Vsps < Base
+
+ check_capability :for => lambda { |m| driver.respond_to? m }
+ collection :vsps do
+
+ description 'A VSP represents the connection parameters of a network port'
+
+ operation :index do
+ description 'List all VSPs in the VSPCollection'
+ param :CIMISelect, :string, :optional
+ control do
+ vsps = VSPCollection.default(self).filter_by(params[:CIMISelect])
+ respond_to do |format|
+ format.xml {vsps.to_xml}
+ format.json {vsps.to_json}
+ end
+ end
+ end
+
+ operation :show do
+ description 'Show a specific VSP'
+ control do
+ vsp = VSP.find(params[:id], self)
+ respond_to do |format|
+ format.xml {vsp.to_xml}
+ format.json {vsp.to_json}
+ end
+ end
+ end
+
+ operation :create do
+ description "Create a new VSP"
+ control do
+ if request.content_type.end_with?("json")
+ vsp = CIMI::Model::VSP.create(request.body.read, self, :json)
+ else
+ vsp = CIMI::Model::VSP.create(request.body.read, self, :xml)
+ end
+ respond_to do |format|
+ format.xml { vsp.to_xml }
+ format.json { vsp.to_json }
+ end
+ end
+ end
+
+ operation :destroy do
+ description "Delete a specified VSP"
+ control do
+ CIMI::Model::VSP.delete!(params[:id], self)
+ no_content_with_status(200)
+ end
+ end
+
+ action :start do
+ description "Start specific VSP."
+ param :id, :string, :required
+ control do
+ vsp = VSP.find(params[:id], self)
+ report_error(404) unless vsp
+ if request.content_type.end_with?("json")
+ action = Action.from_json(request.body.read)
+ else
+ action = Action.from_xml(request.body.read)
+ end
+ vsp.perform(action, self) do |operation|
+ no_content_with_status(202) if operation.success?
+ # Handle errors using operation.failure?
+ end
+ end
+ end
+
+ action :stop do
+ description "Stop specific VSP."
+ control do
+ vsp = VSP.find(params[:id], self)
+ report_error(404) unless vsp
+ if request.content_type.end_with?("json")
+ action = Action.from_json(request.body.read)
+ else
+ action = Action.from_xml(request.body.read)
+ end
+ vsp.perform(action, self) do |operation|
+ no_content_with_status(202) if operation.success?
+ # Handle errors using operation.failure?
+ end
+ end
+ end
+
+ end
+
+ end
+end
diff --git a/server/lib/cimi/helpers.rb b/server/lib/cimi/helpers.rb
new file mode 100644
index 0000000..4535c39
--- /dev/null
+++ b/server/lib/cimi/helpers.rb
@@ -0,0 +1,104 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module Deltacloud; end
+module CIMI; end
+
+require_relative '../deltacloud/drivers'
+require_relative '../deltacloud/models'
+require_relative '../deltacloud/helpers/driver_helper'
+require_relative '../deltacloud/helpers/auth_helper'
+require_relative '../deltacloud/helpers/url_helper'
+require_relative '../deltacloud/helpers/assets_helper'
+require_relative '../deltacloud/helpers/deltacloud_helper'
+require_relative '../deltacloud/helpers/rabbit_helper'
+require_relative '../deltacloud/helpers/rabbit_helper'
+require_relative '../deltacloud/core_ext/string'
+require_relative '../deltacloud/core_ext/array'
+require_relative '../deltacloud/core_ext/hash'
+require_relative '../deltacloud/core_ext/integer'
+require_relative '../deltacloud/core_ext/proc'
+require_relative './helpers/cimi_helper'
+require_relative './models'
+
+module CIMI::Collections
+ class Base < Sinatra::Base
+
+ extend Deltacloud::Helpers::Drivers
+ include Sinatra::Rabbit::Features
+ include CIMI::Model
+
+ helpers Deltacloud::Helpers::Drivers
+ helpers Sinatra::AuthHelper
+ helpers Sinatra::UrlForHelper
+ helpers Sinatra::StaticAssets::Helpers
+ helpers Rack::RespondTo::Helpers
+ helpers Deltacloud::Helpers::Application
+
+ register Rack::RespondTo
+
+ enable :xhtml
+ enable :dump_errors
+ enable :show_errors
+ disable :show_exceptions
+
+ set :root_url, API_ROOT_URL
+ set :version, API_VERSION
+ set :root, File.join(File.dirname(__FILE__), '..', '..')
+ set :views, root + '/views/cimi'
+ set :public_folder, root + '/public'
+
+ error do
+ report_error
+ end
+
+ error Deltacloud::ExceptionHandler::ValidationFailure do
+ report_error
+ end
+
+ before do
+ # Respond with 400, If we don't get a http Host header,
+ halt 400, "Unable to find HTTP Host header" if @env['HTTP_HOST'] == nil
+ end
+
+ after do
+ headers 'X-CIMI-Specification-Version' => API_VERSION
+ end
+
+ def self.new_route_for(route, &block)
+ get route_for('/' + route.to_s + '/new') do
+ instance_eval(&block) if block_given?
+ respond_to do |format|
+ format.html do
+ haml :"#{route}/new"
+ end
+ end
+ end
+ end
+
+ def self.check_capability(opts={})
+ Sinatra::Rabbit.set :check_capability, opts[:for]
+ end
+
+ def self.check_features(opts={})
+ Sinatra::Rabbit.set :check_features, opts[:for]
+ end
+
+ def self.route_for(url)
+ "#{settings.root_url}#{url}"
+ end
+
+ end
+end
diff --git a/server/lib/cimi/model.rb b/server/lib/cimi/model.rb
deleted file mode 100644
index fa3c771..0000000
--- a/server/lib/cimi/model.rb
+++ /dev/null
@@ -1,67 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-#
-
-# Declare namespace for CIMI model
-#
-module CIMI
- module Model; end
-end
-
-require 'cimi/model/schema'
-require 'cimi/model/base'
-require 'cimi/model/errors'
-require 'cimi/model/cloud_entry_point'
-require 'cimi/model/machine_template'
-require 'cimi/model/machine_image'
-require 'cimi/model/machine_configuration'
-require 'cimi/model/action'
-require 'cimi/model/machine'
-require 'cimi/model/volume'
-require 'cimi/model/machine_admin'
-require 'cimi/model/volume_configuration'
-require 'cimi/model/volume_image'
-require 'cimi/model/volume_template'
-require 'cimi/model/machine_template_collection'
-require 'cimi/model/machine_image_collection'
-require 'cimi/model/machine_configuration_collection'
-require 'cimi/model/machine_collection'
-require 'cimi/model/volume_collection'
-require 'cimi/model/machine_admin_collection'
-require 'cimi/model/volume_configuration_collection'
-require 'cimi/model/volume_image_collection'
-require 'cimi/model/volume_template_collection'
-require 'cimi/model/entity_metadata'
-require 'cimi/model/entity_metadata_collection'
-require 'cimi/model/network'
-require 'cimi/model/network_collection'
-require 'cimi/model/network_configuration'
-require 'cimi/model/network_configuration_collection'
-require 'cimi/model/network_template'
-require 'cimi/model/network_template_collection'
-require 'cimi/model/routing_group'
-require 'cimi/model/routing_group_collection'
-require 'cimi/model/routing_group_template'
-require 'cimi/model/routing_group_template_collection'
-require 'cimi/model/vsp'
-require 'cimi/model/vsp_collection'
-require 'cimi/model/vsp_configuration'
-require 'cimi/model/vsp_configuration_collection'
-require 'cimi/model/vsp_template'
-require 'cimi/model/vsp_template_collection'
-require 'cimi/model/address'
-require 'cimi/model/address_collection'
-require 'cimi/model/address_template'
-require 'cimi/model/address_template_collection'
diff --git a/server/lib/cimi/model/action.rb b/server/lib/cimi/model/action.rb
deleted file mode 100644
index c1c9908..0000000
--- a/server/lib/cimi/model/action.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::Action < CIMI::Model::Base
-
- text :action
-
- def name
- action.split('/').last.strip.intern
- end
-
-end
diff --git a/server/lib/cimi/model/address.rb b/server/lib/cimi/model/address.rb
deleted file mode 100644
index 8838331..0000000
--- a/server/lib/cimi/model/address.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::Address < CIMI::Model::Base
-
- text :ip
-
- text :hostname
-
- text :allocation
-
- text :default_gateway
-
- text :dns
-
- text :mac_address
-
- text :protocol
-
- text :mask
-
- href :network
-
- href :resource
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- if id==:all
- context.driver.addresses(context.credentials, {:env=>context})
- else
- context.driver.addresses(context.credentials, {:id=>id, :env=>context})
- end
- end
-
- def self.create(request_body, context, type)
- input = (type == :xml)? XmlSimple.xml_in(request_body, {"ForceArray"=>false, "NormaliseSpace"=>2}) : JSON.parse(request_body)
- if input["addressTemplate"]["href"] #by reference
- address_template = AddressTemplate.find(context.href_id(input["addressTemplate"]["href"], :address_templates), context)
- else
- case type
- when :json
- address_template = AddressTemplate.from_json(JSON.generate(input["addressTemplate"]))
- when :xml
- xml = XmlSimple.xml_in(request_body, {"NormaliseSpace"=>2})
- address_template = AddressTemplate.from_xml(XmlSimple.xml_out(xml["addressTemplate"][0]))
- end
- end
- params = {:name=>input["name"], :description=>input["description"], :address_template=>address_template, :env=>context }
- raise CIMI::Model::BadRequest.new("Bad request - missing required parameters. Client sent: #{request_body} which produced #{params.inspect}") if params.has_value?(nil)
- context.driver.create_address(context.credentials, params)
- end
-
- def self.delete!(id, context)
- context.driver.delete_address(context.credentials, id)
- end
-
-end
diff --git a/server/lib/cimi/model/address_collection.rb b/server/lib/cimi/model/address_collection.rb
deleted file mode 100644
index eef6c51..0000000
--- a/server/lib/cimi/model/address_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::AddressCollection < CIMI::Model::Base
-
- act_as_root_entity :address
-
- array :addresses do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.addresses_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} AddressCollection",
- :addresses => CIMI::Model::Address.all(context).map { |addr| { :href => addr.id } }
- )
- end
-
-end
diff --git a/server/lib/cimi/model/address_template.rb b/server/lib/cimi/model/address_template.rb
deleted file mode 100644
index 9d2c409..0000000
--- a/server/lib/cimi/model/address_template.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::AddressTemplate < CIMI::Model::Base
-
- text :ip
-
- text :hostname
-
- text :allocation
-
- text :default_gateway
-
- text :dns
-
- text :mac_address
-
- text :protocol
-
- text :mask
-
- href :network
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- if id==:all
- context.driver.address_templates(context.credentials, {:env=>context})
- else
- context.driver.address_templates(context.credentials, {:id=>id, :env=>context})
- end
- end
-
- def self.create(request_body, context, type)
- end
-
- def self.delete!(id, context)
- end
-
-end
diff --git a/server/lib/cimi/model/address_template_collection.rb b/server/lib/cimi/model/address_template_collection.rb
deleted file mode 100644
index e973252..0000000
--- a/server/lib/cimi/model/address_template_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::AddressTemplateCollection < CIMI::Model::Base
-
- act_as_root_entity :address_template
-
- array :address_templates do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.address_templates_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} AddressTemplateCollection",
- :address_templates => AddressTemplate.all(context).map { |addr| { :href => addr.id } }
- )
- end
-
-end
diff --git a/server/lib/cimi/model/base.rb b/server/lib/cimi/model/base.rb
deleted file mode 100644
index 16812ac..0000000
--- a/server/lib/cimi/model/base.rb
+++ /dev/null
@@ -1,249 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-require 'xmlsimple'
-require 'json'
-
-# The base class for any CIMI object that we either read from a request or
-# write as a response. This class handles serializing/deserializing XML and
-# JSON into a common form.
-#
-# == Defining the schema
-#
-# The conversion of XML and JSON into internal objects is based on a schema
-# that is defined through a DSL:
-#
-# class Machine < CIMI::Model::Base
-# text :status
-# href :meter
-# array :volumes do
-# scalar :href, :attachment_point, :protocol
-# end
-# end
-#
-# The DSL automatically takes care of converting identifiers from their
-# underscored form to the camel-cased form used by CIMI. The above class
-# can be used in the following way:
-#
-# machine = Machine.from_xml(some_xml)
-# if machine.status == "UP"
-# ...
-# end
-# sda = machine.volumes.find { |v| v.attachment_point == "/dev/sda" }
-# handle_meter(machine.meter.href)
-#
-# The keywords for the DSL are
-# [scalar(names, ...)]
-# Define a scalar attribute; in JSON, this is represented as a string
-# property. In XML, this can be represented in a number of ways,
-# depending on whether the option :text is set:
-# * :text not set: attribute on the enclosing element
-# * :text == :direct: the text content of the enclosing element
-# * :text == :nested: the text content of an element +<name>...</name>+
-# [text(names)]
-# A shorthand for +scalar(names, :text => :nested)+, i.e., for
-# attributes that in XML are represented by their own tags
-# [href(name)]
-# A shorthand for +struct name { scalar :href }+; in JSON, this is
-# represented as +{ name: { "href": string } }+, and in XML as +<name
-# href="..."/>+
-# [struct(name, opts, &block)]
-# A structured subobject; the block defines the schema of the
-# subobject. The +:content+ option can be used to specify the attribute
-# that should receive the content of hte corresponding XML element
-# [array(name, opts, &block)]
-# An array of structured subobjects; the block defines the schema of
-# the subobjects.
-
-module CIMI::Model
-
- def self.register_as_root_entity!(name)
- @root_entities ||= []
- @root_entities << name
- unless CIMI::Model::CloudEntryPoint.href_defined?(name)
- CIMI::Model::CloudEntryPoint.send(:href, name.underscore)
- end
- end
-
- def self.root_entities
- @root_entities || []
- end
-
-end
-
-class CIMI::Model::Base
-
- #
- # We keep the values of the attributes in a hash
- #
- attr_reader :attribute_values
-
- # Keep the list of all attributes in an array +attributes+; for each
- # attribute, we also define a getter and a setter to access/change the
- # value for that attribute
- class << self
- def base_schema
- @schema ||= CIMI::Model::Schema.new
- end
-
- def clone_base_schema
- @schema_duped = true
- @schema = Marshal::load(Marshal.dump(superclass.base_schema))
- end
-
- def base_schema_cloned?
- @schema_duped
- end
-
- private :'clone_base_schema', :'base_schema_cloned?'
-
- def inherited(child)
- child.instance_eval do
- def schema
- base_schema_cloned? ? @schema : clone_base_schema
- end
- end
- end
-
- def add_attributes!(names, attr_klass, &block)
- if self.respond_to? :schema
- schema.add_attributes!(names, attr_klass, &block)
- else
- base_schema.add_attributes!(names, attr_klass, &block)
- end
- names.each do |name|
- define_method(name) { @attribute_values[name] }
- define_method(:"#{name}=") { |newval| @attribute_values[name] = newval }
- end
- end
-
- # Return Array of links to current CIMI object
- def all_uri(context)
- self.all(context).map { |e| { :href => e.id } }
- end
- end
-
- extend CIMI::Model::Schema::DSL
-
- def [](a)
- @attribute_values[a]
- end
-
- def []=(a, v)
- @attribute_values[a] = v
- end
-
- #
- # Factory methods
- #
- def initialize(values = {})
- @attribute_values = values
- end
-
- # Construct a new object from the XML representation +xml+
- def self.from_xml(text)
- xml = XmlSimple.xml_in(text, :force_content => true)
- model = self.new
- @schema.from_xml(xml, model)
- model
- end
-
- # Construct a new object
- def self.from_json(text)
- json = JSON::parse(text)
- model = self.new
- @schema.from_json(json, model)
- model
- end
-
- #
- # Serialize
- #
-
- def self.xml_tag_name
- self.name.split("::").last
- end
-
- def self.to_json(model)
- JSON::unparse(@schema.to_json(model))
- end
-
- def self.to_xml(model)
- xml = @schema.to_xml(model)
- xml["xmlns"] = "http://www.dmtf.org/cimi"
- XmlSimple.xml_out(xml, :root_name => xml_tag_name)
- end
-
- def to_json
- self.class.to_json(self)
- end
-
- def to_xml
- self.class.to_xml(self)
- end
-
- #
- # Common attributes for all resources
- #
- text :id, :name, :description, :created
-
- # FIXME: this doesn't match with JSON
- hash :property, :content => :value do
- scalar :name
- end
-
- def self.act_as_root_entity(name=nil)
- if name
- name = name.to_s.camelize.pluralize
- else
- name = xml_tag_name.pluralize.uncapitalize
- end
- CIMI::Model.register_as_root_entity! name
- end
-
- def self.all(_self); find(:all, _self); end
-
- def filter_by(filter_opts)
- return self if filter_opts.nil?
- return filter_attributes(filter_opts.split(',').map{ |a| a.intern }) if filter_opts.include? ','
- case filter_opts
- when /^([\w\_]+)$/ then filter_attributes([$1.intern])
- when /^([\w\_]+)\[(\d+\-\d+)\]$/ then filter_by_arr_range($1.intern, $2)
- when /^([\w\_]+)\[(\d+)\]$/ then filter_by_arr_index($1.intern, $2)
- else self
- end
- end
-
- private
-
- def filter_attributes(attr_list)
- attrs = attr_list.inject({}) do |result, attr|
- result[attr] = self.send(attr) if self.respond_to?(attr)
- result
- end
- self.class.new(attrs)
- end
-
- def filter_by_arr_index(attr, filter)
- return self unless self.respond_to?(attr)
- self.class.new(attr => [self.send(attr)[filter.to_i]])
- end
-
- def filter_by_arr_range(attr, filter)
- return self unless self.respond_to?(attr)
- filter = filter.split('-').inject { |s,e| s.to_i..e.to_i }
- self.class.new(attr => self.send(attr)[filter])
- end
-end
diff --git a/server/lib/cimi/model/cloud_entry_point.rb b/server/lib/cimi/model/cloud_entry_point.rb
deleted file mode 100644
index 5db94df..0000000
--- a/server/lib/cimi/model/cloud_entry_point.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::CloudEntryPoint < CIMI::Model::Base
-
- array :entity_metadata do
- scalar :href
- end
-
- def self.create(context)
- self.new(entities(context).merge({
- :name => context.driver.name,
- :description => "Cloud Entry Point for the Deltacloud #{context.driver.name} driver",
- :id => context.cloudEntryPoint_url,
- :created => Time.now,
- :entity_metadata => EntityMetadata.all_uri(context)
- }))
- end
-
- # Return an Hash of the CIMI root entities used in CloudEntryPoint
- def self.entities(context)
- CIMI::Model.root_entities.inject({}) do |result, entity|
- if context.respond_to? :"#{entity.underscore}_url"
- result[entity.underscore] = { :href => context.send(:"#{entity.underscore}_url") }
- end
- result
- end
- end
-
- private
-
- def self.href_defined?(entity)
- true if schema.attribute_names.include? entity.underscore
- end
-
-end
diff --git a/server/lib/cimi/model/entity_metadata.rb b/server/lib/cimi/model/entity_metadata.rb
deleted file mode 100644
index bc20ff3..0000000
--- a/server/lib/cimi/model/entity_metadata.rb
+++ /dev/null
@@ -1,83 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-
-class CIMI::Model::EntityMetadata < CIMI::Model::Base
-
-text :type_uri
-
- array :attributes do
- scalar :name
- scalar :namespace
- scalar :type
- scalar :required
- scalar :constraints
- end
-
- array :operations do
- scalar :name
- scalar :uri
- scalar :description
- scalar :method
- scalar :input_message
- scalar :output_message
- end
-
- def self.find(id, context)
- entity_metadata = []
- if id == :all
- CIMI::Model.root_entities.each do |entity|
- entity_class = CIMI::Model.const_get("#{entity.singularize}")
- entity_metadata << entity_class.create_entity_metadata(context) if entity_class.respond_to?(:create_entity_metadata)
- end
- return entity_metadata
- else
- entity_class = CIMI::Model.const_get("#{id.camelize}")
- if entity_class.respond_to?(:create_entity_metadata)
- entity_class.create_entity_metadata(context)
- end
- end
- end
-
- def self.metadata_from_deltacloud_features(cimi_entity, dcloud_entity, context)
- deltacloud_features = context.driver.features(dcloud_entity)
- metadata_attributes = deltacloud_features.map{|f| attributes_from_feature(f)}
- from_feature(cimi_entity, context, metadata_attributes.flatten!)
- end
-
- def includes_attribute?(attribute)
- self.attributes.any?{|attr| attr[:name] == attribute}
- end
-
- private
-
- def self.attributes_from_feature(feature)
- feature.operations.first.params.inject([]) do |result, param|
- result << {
- :name=>(feature.name == :user_name ? :name : param[0]),
- :type=> "xs:string",
- :required=> (param[1] and param[1].optional?) ? "false" : "true",
- :constraints=> (feature.constraints.empty? ? (feature.description.nil? ? "" : feature.description): feature.constraints)
- }
- end
- end
-
- def self.from_feature(cimi_entity, context, metadata_attributes)
- self.new(:name => cimi_entity, :uri=>"#{context.entity_metadata_url}/#{cimi_entity.underscore}",
- :type_uri=> context.send("#{cimi_entity.pluralize.underscore}_url"),
- :attributes => metadata_attributes)
- end
-
-end
diff --git a/server/lib/cimi/model/entity_metadata_collection.rb b/server/lib/cimi/model/entity_metadata_collection.rb
deleted file mode 100644
index 63db7f7..0000000
--- a/server/lib/cimi/model/entity_metadata_collection.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::EntityMetadataCollection < CIMI::Model::Base
-
- array :entity_metadata do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.entity_metadata_url,
- :name => 'default',
- :created => Time.now,
- :entity_metadata => EntityMetadata.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/errors.rb b/server/lib/cimi/model/errors.rb
deleted file mode 100644
index 7c090ed..0000000
--- a/server/lib/cimi/model/errors.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-module CIMI::Model
-
- class NotFound < StandardError
- attr_accessor :code
-
- def initialize
- super("Requested Entity Not Found")
- self.code = 404
- end
-
- end
-
- class BadRequest < StandardError
- attr_accessor :code
- def initialize(msg="")
- super(msg)
- self.code=400
- end
- end
-
- class NotImplemented < StandardError
- attr_accessor :code
-
- def initialize
- super("Requested operation is not implemented by backend provider")
- self.code = 501
- end
-
- end
-
-end
-
-
diff --git a/server/lib/cimi/model/machine.rb b/server/lib/cimi/model/machine.rb
deleted file mode 100644
index 939629a..0000000
--- a/server/lib/cimi/model/machine.rb
+++ /dev/null
@@ -1,229 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-require 'deltacloud/models/instance_address'
-
-class CIMI::Model::Machine < CIMI::Model::Base
-
- text :state
- text :cpu
-
- struct :memory do
- scalar :quantity
- scalar :units
- end
-
- href :event_log
-
- array :disks do
- struct :capacity do
- scalar :quantity
- scalar :units
- end
- scalar :format
- scalar :attachment_point
- end
-
- array :volumes do
- scalar :href
- scalar :protocol
- scalar :attachment_point
- end
-
- array :network_interfaces do
- href :vsp
- text :hostname, :mac_address, :state, :protocol, :allocation
- text :address, :default_gateway, :dns, :max_transmission_unit
- end
-
- array :meters do
- scalar :href
- end
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- instances = []
- if id == :all
- instances = context.driver.instances(context.credentials)
- instances.map { |instance| from_instance(instance, context) }.compact
- else
- instance = context.driver.instance(context.credentials, :id => id)
- raise CIMI::Model::NotFound unless instance
- from_instance(instance, context)
- end
- end
-
- def self.create_from_json(body, context)
- json = JSON.parse(body)
- hardware_profile_id = xml['machineTemplate']['machineConfig']["href"].split('/').last
- image_id = xml['machineTemplate']['machineImage']["href"].split('/').last
- instance = context.create_instance(context.credentials, image_id, { :hwp_id => hardware_profile_id })
- from_instance(instance, context)
- end
-
- def self.create_from_xml(body, context)
- xml = XmlSimple.xml_in(body)
- machine_template = xml['machineTemplate'][0]
- hardware_profile_id = machine_template['machineConfig'][0]["href"].split('/').last
- image_id = machine_template['machineImage'][0]["href"].split('/').last
- additional_params = {}
- additional_params[:name] =xml['name'][0] if xml['name']
- if machine_template.has_key? 'machineAdmin'
- additional_params[:keyname] = machine_template['machineAdmin'][0]["href"].split('/').last
- end
- instance = context.driver.create_instance(context.credentials, image_id, {
- :hwp_id => hardware_profile_id
- }.merge(additional_params))
- from_instance(instance, context)
- end
-
- def perform(action, context, &block)
- begin
- if context.driver.send(:"#{action.name}_instance", context.credentials, self.name)
- block.callback :success
- else
- raise "Operation failed to execute on given Machine"
- end
- rescue => e
- block.callback :failure, e.message
- end
- end
-
- def self.delete!(id, context)
- context.driver.destroy_instance(context.credentials, id)
- end
-
- def self.create_entity_metadata(context)
- cimi_entity = self.name.split("::").last
- metadata = EntityMetadata.metadata_from_deltacloud_features(cimi_entity, :instances, context)
- unless metadata.includes_attribute?(:name)
- metadata.attributes << {:name=>"name", :required=>"false",
- :constraints=>"Determined by the cloud provider", :type=>"xs:string"}
- end
- metadata
- end
-
- def self.attach_volumes(volumes, context)
- volumes.each do |vol|
- context.driver.attach_storage_volume(context.credentials,
- {:id=>vol[:volume].name, :instance_id=>context.params[:id], :device=>vol[:attachment_point]})
- end
- self.find(context.params[:id], context)
- end
-
- def self.detach_volumes(volumes, context)
- volumes.each do |vol|
- context.driver.detach_storage_volume(context.credentials, {:id=>vol[:volume].name, :instance_id => context.params[:id]})
- end
- self.find(context.params[:id], context)
- end
-
- private
-
- def self.from_instance(instance, context)
- cpu = memory = disks = (instance.instance_profile.id == "opaque")? "n/a" : nil
- self.new(
- :name => instance.id,
- :description => instance.name,
- :created => instance.launch_time,
- :id => context.machine_url(instance.id),
- :state => convert_instance_state(instance.state),
- :cpu => cpu || convert_instance_cpu(instance.instance_profile, context),
- :memory => memory || convert_instance_memory(instance.instance_profile, context),
- :disks => disks || convert_instance_storage(instance.instance_profile, context),
- :network_interfaces => convert_instance_addresses(instance),
- :operations => convert_instance_actions(instance, context),
- :volumes=>convert_storage_volumes(instance, context),
- :property => convert_instance_properties(instance, context)
- )
- end
-
- # FIXME: This will convert 'RUNNING' state to 'STARTED'
- # which is defined in CIMI (p65)
- #
- def self.convert_instance_state(state)
- ('RUNNING' == state) ? 'STARTED' : state
- end
-
- def self.convert_instance_properties(instance, context)
- properties = []
- properties << { :name => :machine_image, :value => context.machine_image_url(instance.image_id) }
- if instance.respond_to? :keyname
- properties << { :name => :machine_admin, :value => context.machine_admin_url(instance.keyname) }
- end
- properties
- end
-
- def self.convert_instance_cpu(profile, context)
- cpu_override = profile.overrides.find { |p, v| p == :cpu }
- if cpu_override.nil?
- MachineConfiguration.find(profile.id, context).cpu
- else
- cpu_override[1]
- end
- end
-
- def self.convert_instance_memory(profile, context)
- machine_conf = MachineConfiguration.find(profile.name, context)
- memory_override = profile.overrides.find { |p, v| p == :memory }
- {
- :quantity => memory_override.nil? ? machine_conf.memory[:quantity] : memory_override[1],
- :units => machine_conf.memory[:units]
- }
- end
-
- def self.convert_instance_storage(profile, context)
- machine_conf = MachineConfiguration.find(profile.name, context)
- storage_override = profile.overrides.find { |p, v| p == :storage }
- [
- { :capacity => {
- :quantity => storage_override.nil? ? machine_conf.disks.first[:capacity][:quantity] : storage_override[1],
- :units => machine_conf.disks.first[:capacity][:units]
- }
- }
- ]
- end
-
- def self.convert_instance_addresses(instance)
- (instance.public_addresses + instance.private_addresses).collect do |address|
- {
- :hostname => address.is_hostname? ? address : nil,
- :mac_address => address.is_mac? ? address : nil,
- :state => 'Active',
- :protocol => 'IPv4',
- :address => address.is_ipv4? ? address : nil,
- :allocation => 'Static'
- }
- end
- end
-
- def self.convert_instance_actions(instance, context)
- instance.actions.collect do |action|
- action = :destroy if action == :delete # In CIMI destroy operation become delete
- action = :restart if action == :reboot # In CIMI reboot operation become restart
- { :href => context.send(:"#{action}_machine_url", instance.id), :rel => "http://www.dmtf.org/cimi/action/#{action}" }
- end
- end
-
- def self.convert_storage_volumes(instance, context)
- instance.storage_volumes ||= [] #deal with nilpointers
- instance.storage_volumes.map{|vol| {:href=>context.volume_url(vol.keys.first),
- :attachment_point=>vol.values.first} }
- end
-
-end
diff --git a/server/lib/cimi/model/machine_admin.rb b/server/lib/cimi/model/machine_admin.rb
deleted file mode 100644
index fed7c80..0000000
--- a/server/lib/cimi/model/machine_admin.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::MachineAdmin < CIMI::Model::Base
-
- text :username
- text :password
- text :key
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- if id == :all
- keys = context.driver.keys(context.credentials)
- keys.map { |key| from_key(key, context) }
- else
- key = context.driver.key(context.credentials, :id => id)
- from_key(key, context)
- end
- end
-
- def self.create_from_xml(body, context)
- machine_admin = MachineAdmin.from_xml(body)
- key = context.driver.create_key(context.credentials, :key_name => machine_admin.name)
- from_key(key, context)
- end
-
- def self.delete!(id, context)
- context.driver.destroy_key(context.credentials, :id => id)
- end
-
- private
-
- def self.from_key(key, context)
- self.new(
- :name => key.id,
- :username => key.username,
- :password => key.is_password? ? key.password : key.fingerprint,
- :key => key.is_key? ? key.pem_rsa_key : nil,
- :id => context.machine_admin_url(key.id),
- :created => Time.now
- )
- end
-
-end
diff --git a/server/lib/cimi/model/machine_admin_collection.rb b/server/lib/cimi/model/machine_admin_collection.rb
deleted file mode 100644
index fd76a52..0000000
--- a/server/lib/cimi/model/machine_admin_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::MachineAdminCollection < CIMI::Model::Base
-
- act_as_root_entity :machine_admin
-
- array :machine_admins do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.machine_admins_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} MachineAdminCollection",
- :machine_admins => MachineAdmin.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/machine_collection.rb b/server/lib/cimi/model/machine_collection.rb
deleted file mode 100644
index 27aa61b..0000000
--- a/server/lib/cimi/model/machine_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::MachineCollection < CIMI::Model::Base
-
- act_as_root_entity :machine
-
- array :machines do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.machines_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} MachineCollection",
- :machines => Machine.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/machine_configuration.rb b/server/lib/cimi/model/machine_configuration.rb
deleted file mode 100644
index f9d98f2..0000000
--- a/server/lib/cimi/model/machine_configuration.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::MachineConfiguration < CIMI::Model::Base
-
- struct :memory do
- scalar :quantity
- scalar :units
- end
-
- text :cpu
-
- array :disks do
- struct :capacity do
- scalar :quantity
- scalar :units
- end
- scalar :format
- scalar :attachment_point
- end
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- profiles = []
- if id == :all
- profiles = context.driver.hardware_profiles(context.credentials)
- profiles.map { |profile| from_hardware_profile(profile, context) }.compact
- else
- profile = context.driver.hardware_profile(context.credentials, id)
- from_hardware_profile(profile, context)
- end
- end
-
- private
-
- def self.from_hardware_profile(profile, context)
- # We accept just profiles with all properties set
- return unless profile.memory or profile.cpu or profile.storage
- memory = profile.memory.value || profile.memory.default
- cpu = profile.cpu.value || profile.cpu.default
- storage = profile.storage.value || profile.storage.default
- machine_hash = {
- :name => profile.name,
- :description => "Machine Configuration with #{memory} #{profile.memory.unit} "+
- "of memory and #{cpu} CPU",
- :cpu => cpu,
- :created => Time.now.to_s, # FIXME: DC hardware_profile has no mention about created_at
- :memory => { :quantity => profile.memory.value || profile.memory.default, :units => profile.memory.unit },
- :disks => [ { :capacity => { :quantity => profile.storage.value || profile.storage.default, :units => profile.storage.unit } } ],
- :id => context.machine_configuration_url(profile.name)
- }
- self.new(machine_hash)
- end
-
-end
diff --git a/server/lib/cimi/model/machine_configuration_collection.rb b/server/lib/cimi/model/machine_configuration_collection.rb
deleted file mode 100644
index 171acac..0000000
--- a/server/lib/cimi/model/machine_configuration_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::MachineConfigurationCollection < CIMI::Model::Base
-
- act_as_root_entity :machine_configuration
-
- array :machine_configurations do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.machine_configurations_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} MachineConfigurationCollection",
- :machine_configurations => MachineConfiguration.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/machine_image.rb b/server/lib/cimi/model/machine_image.rb
deleted file mode 100644
index 7389475..0000000
--- a/server/lib/cimi/model/machine_image.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::MachineImage < CIMI::Model::Base
-
- href :image_location
- text :image_data
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- images = []
- if id == :all
- images = context.driver.images(context.credentials)
- images.map { |image| from_image(image, context) }
- else
- image = context.driver.image(context.credentials, :id => id)
- from_image(image, context)
- end
- end
-
- def self.from_image(image, context)
- self.new(
- :name => image.id,
- :id => context.machine_image_url(image.id),
- :description => image.description,
- :created => Time.now.to_s,
- :image_location => { :href => "#{context.driver.name}://#{image.id}" } # FIXME
- )
- end
-
-end
diff --git a/server/lib/cimi/model/machine_image_collection.rb b/server/lib/cimi/model/machine_image_collection.rb
deleted file mode 100644
index b02ede7..0000000
--- a/server/lib/cimi/model/machine_image_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::MachineImageCollection < CIMI::Model::Base
-
- act_as_root_entity :machine_image
-
- array :machine_images do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.machine_images_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} MachineImageCollection",
- :machine_images => MachineImage.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/machine_template.rb b/server/lib/cimi/model/machine_template.rb
deleted file mode 100644
index 8a88052..0000000
--- a/server/lib/cimi/model/machine_template.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::MachineTemplate < CIMI::Model::Base
-
- href :machine_config
- href :machine_image
- href :machine_admin
-
- array :volumes do
- scalar :href
- scalar :protocol
- scalar :attachment_point
- end
-
- array :volume_templates do
- scalar :href, :attachment_point, :protocol
- end
-
- array :network_interfaces do
- href :vsp
- text :hostname, :mac_address, :state, :protocol, :allocation
- text :address, :default_gateway, :dns, :max_transmission_unit
- end
-
- array :operations do
- scalar :rel, :href
- end
-end
diff --git a/server/lib/cimi/model/machine_template_collection.rb b/server/lib/cimi/model/machine_template_collection.rb
deleted file mode 100644
index e1e8d30..0000000
--- a/server/lib/cimi/model/machine_template_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::MachineTemplateCollection < CIMI::Model::Base
-
- act_as_root_entity :machine_template
-
- array :machine_templates do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.machine_template_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} MachineTemplateCollection",
- :machine_templates => MachineTemplate.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/network.rb b/server/lib/cimi/model/network.rb
deleted file mode 100644
index cbfbae0..0000000
--- a/server/lib/cimi/model/network.rb
+++ /dev/null
@@ -1,106 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::Network < CIMI::Model::Base
-
- text :state
-
- text :access
-
- text :bandwidth_limit
-
- text :traffic_priority
-
- text :max_traffic_delay
-
- text :max_traffic_loss
-
- text :max_traffic_jitter
-
- href :routing_group
-
- href :event_log
-
- array :meters do
- scalar :href
- end
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- networks=[]
- if id==:all
- networks = context.driver.networks(context.credentials, {:env=>context})
- else
- networks = context.driver.networks(context.credentials, {:id=>id, :env=>context})
- end
- networks
- end
-
- def self.create(request_body, context, type)
- input = (type == :xml)? XmlSimple.xml_in(request_body, {"ForceArray"=>false,"NormaliseSpace"=>2}) : JSON.parse(request_body)
- if input["networkTemplate"]["href"] #template by reference
- network_config, routing_group = get_by_reference(input, context)
- else
- if input["networkTemplate"]["networkConfig"]["href"] # configuration by reference
- network_config = NetworkConfiguration.find(context.href_id(input["networkTemplate"]["networkConfig"]["href"],:network_configurations), context)
- else #configuration by value
- network_config = get_by_value(request_body, type)
- end
- routing_group = RoutingGroup.find(context.href_id(input["networkTemplate"]["routingGroup"]["href"], :routing_groups), context)
- end
- params = {:network_config => network_config, :routing_group => routing_group, :name=>input["name"], :description=>input["description"], :env=>context}
- raise CIMI::Model::BadRequest.new("Bad request - missing required parameters. Client sent: #{request_body} which produced #{params.inspect}") if params.has_value?(nil)
- context.driver.create_network(context.credentials, params)
- end
-
- def self.delete!(id, context)
- context.driver.delete_network(context.credentials, id)
- end
-
- def perform(action, context, &block)
- begin
- if context.driver.send(:"#{action.name}_network", context.credentials, self.name)
- block.callback :success
- else
- raise "Operation #{action.name} failed to execute on the Network #{self.name} "
- end
- rescue => e
- block.callback :failure, e.message
- end
- end
-
- private
-
- def self.get_by_reference(input, context)
- network_template = NetworkTemplate.find(context.href_id(input["networkTemplate"]["href"], :network_templates), context)
- network_config = NetworkConfiguration.find(context.href_id(network_template.network_config.href, :network_configurations), context)
- routing_group = RoutingGroup.find(context.href_id(network_template.routing_group.href, :routing_groups), context)
- return network_config, routing_group
- end
-
- def self.get_by_value(request_body, type)
- if type == :xml
- xml_arrays = XmlSimple.xml_in(request_body, {"NormaliseSpace"=>2})
- network_config = NetworkConfiguration.from_xml(XmlSimple.xml_out(xml_arrays["networkTemplate"][0]["networkConfig"][0]))
- else
- json = JSON.parse(request_body)
- network_config = NetworkConfiguration.from_json(JSON.generate(json["networkTemplate"]["networkConfig"]))
- end
- end
-
-end
diff --git a/server/lib/cimi/model/network_collection.rb b/server/lib/cimi/model/network_collection.rb
deleted file mode 100644
index 836d8e8..0000000
--- a/server/lib/cimi/model/network_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::NetworkCollection < CIMI::Model::Base
-
- act_as_root_entity :network
-
- array :networks do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.networks_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} NetworkCollection",
- :networks => Network.all(context).map { |c| { :href => c.id } }
- )
- end
-
-end
diff --git a/server/lib/cimi/model/network_configuration.rb b/server/lib/cimi/model/network_configuration.rb
deleted file mode 100644
index 1b04548..0000000
--- a/server/lib/cimi/model/network_configuration.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::NetworkConfiguration < CIMI::Model::Base
-
- text :access
-
- text :bandwidth_limit
-
- text :traffic_priority
-
- text :max_traffic_delay
-
- text :max_traffic_loss
-
- text :max_traffic_jitter
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- network_configs = []
- if id==:all
- network_configs = context.driver.network_configurations(context.credentials, {:env=>context})
- else
- network_configs = context.driver.network_configurations(context.credentials, {:env=>context, :id=>id})
- end
- network_configs
- end
-
- def self.create_from_xml(request_body, context)
- end
-
- def self.create_from_json(request_body, context)
- end
-end
diff --git a/server/lib/cimi/model/network_configuration_collection.rb b/server/lib/cimi/model/network_configuration_collection.rb
deleted file mode 100644
index fd70047..0000000
--- a/server/lib/cimi/model/network_configuration_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::NetworkConfigurationCollection < CIMI::Model::Base
-
- act_as_root_entity :network_configuration
-
- array :network_configurations do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.network_configurations_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} NetworkConfigurationCollection",
- :network_configurations => NetworkConfiguration.all(context).map { |c| { :href => c.id } }
- )
- end
-
-end
diff --git a/server/lib/cimi/model/network_template.rb b/server/lib/cimi/model/network_template.rb
deleted file mode 100644
index ce3b990..0000000
--- a/server/lib/cimi/model/network_template.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::NetworkTemplate < CIMI::Model::Base
-
- href :network_config
-
- href :routing_group
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- network_templates = []
- if id==:all
- network_templates = context.driver.network_templates(context.credentials, {:env=>context})
- else
- network_templates = context.driver.network_templates(context.credentials, {:env=>context, :id=>id})
- end
- network_templates
- end
-
-end
diff --git a/server/lib/cimi/model/network_template_collection.rb b/server/lib/cimi/model/network_template_collection.rb
deleted file mode 100644
index 6b97b6e..0000000
--- a/server/lib/cimi/model/network_template_collection.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-
-class CIMI::Model::NetworkTemplateCollection < CIMI::Model::Base
-
- act_as_root_entity :network_template
-
- array :network_templates do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.network_templates_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} NetworkTemplateCollection",
- :network_templates => NetworkTemplate.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/routing_group.rb b/server/lib/cimi/model/routing_group.rb
deleted file mode 100644
index d26f4d7..0000000
--- a/server/lib/cimi/model/routing_group.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::RoutingGroup < CIMI::Model::Base
-
- array :networks do
- scalar :href
- end
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- if id==:all
- context.driver.routing_groups(context.credentials, {:env=>context})
- else
- context.driver.routing_groups(context.credentials, {:env=>context, :id=>id})
- end
- end
-
-end
diff --git a/server/lib/cimi/model/routing_group_collection.rb b/server/lib/cimi/model/routing_group_collection.rb
deleted file mode 100644
index 1546c80..0000000
--- a/server/lib/cimi/model/routing_group_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::RoutingGroupCollection < CIMI::Model::Base
-
- act_as_root_entity :routing_group
-
- array :routing_groups do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.routing_groups_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} RoutingGroupCollection",
- :routing_groups => RoutingGroup.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/routing_group_template.rb b/server/lib/cimi/model/routing_group_template.rb
deleted file mode 100644
index 204a353..0000000
--- a/server/lib/cimi/model/routing_group_template.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::RoutingGroupTemplate < CIMI::Model::Base
-
- array :networks do
- scalar :href
- end
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- if id==:all
- context.driver.routing_group_templates(context.credentials, {:env=>context})
- else
- context.driver.routing_group_templates(context.credentials, {:env=>context, :id=>id})
- end
- end
-
-end
diff --git a/server/lib/cimi/model/routing_group_template_collection.rb b/server/lib/cimi/model/routing_group_template_collection.rb
deleted file mode 100644
index 5e7a9ba..0000000
--- a/server/lib/cimi/model/routing_group_template_collection.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-
-class CIMI::Model::RoutingGroupTemplateCollection < CIMI::Model::Base
-
- act_as_root_entity :routing_group_template
-
- array :routing_group_templates do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.routing_group_templates_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} RoutingGroupTemplateCollection",
- :routing_group_templates => RoutingGroupTemplate.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/schema.rb b/server/lib/cimi/model/schema.rb
deleted file mode 100644
index f301b69..0000000
--- a/server/lib/cimi/model/schema.rb
+++ /dev/null
@@ -1,277 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-#
-
-# The smarts of converting from XML and JSON into internal objects
-class CIMI::Model::Schema
-
- #
- # Attributes describe how we extract values from XML/JSON
- #
- class Attribute
- attr_reader :name, :xml_name, :json_name
-
- def initialize(name, opts = {})
- @name = name
- @xml_name = (opts[:xml_name] || name).to_s.camelize(true)
- @json_name = (opts[:json_name] || name).to_s.camelize(true)
- end
-
- def from_xml(xml, model)
- model[@name] = xml[@xml_name].first if xml.has_key?(@xml_name)
- end
-
- def from_json(json, model)
- model[@name] = json[@json_name]
- end
-
- def to_xml(model, xml)
- xml[@xml_name] = [model[@name]] if model[@name]
- end
-
- def to_json(model, json)
- json[@json_name] = model[@name] if model and model[@name]
- end
- end
-
- class Scalar < Attribute
- def initialize(name, opts)
- @text = opts[:text]
- if ! [nil, :nested, :direct].include?(@text)
- raise "text option for scalar must be :nested or :direct"
- end
- super(name, opts)
- end
-
- def text?; @text; end
-
- def nested_text?; @text == :nested; end
-
- def from_xml(xml, model)
- case @text
- when :nested then model[@name] = xml[@xml_name].first["content"] if xml[@xml_name]
- when :direct then model[@name] = xml["content"]
- else model[@name] = xml[@xml_name]
- end
- end
-
- def to_xml(model, xml)
- return unless model
- return unless model[@name]
- case @text
- when :nested then xml[@xml_name] = [{ "content" => model[@name] }]
- when :direct then xml["content"] = model[@name]
- else xml[@xml_name] = model[@name]
- end
- end
- end
-
- class Struct < Attribute
- def initialize(name, opts, &block)
- content = opts[:content]
- super(name, opts)
- @schema = CIMI::Model::Schema.new
- @schema.instance_eval(&block) if block_given?
- @schema.scalar(content, :text => :direct) if content
- end
-
- def from_xml(xml, model)
- xml = xml.has_key?(xml_name) ? xml[xml_name].first : {}
- model[name] = convert_from_xml(xml)
- end
-
- def from_json(json, model)
- json = json.has_key?(json_name) ? json[json_name] : {}
- model[name] = convert_from_json(json)
- end
-
- def to_xml(model, xml)
- conv = convert_to_xml(model[name])
- xml[xml_name] = [conv] unless conv.empty?
- end
-
- def to_json(model, json)
- conv = convert_to_json(model[name])
- json[json_name] = conv unless conv.empty?
- end
-
- def convert_from_xml(xml)
- sub = struct.new
- @schema.from_xml(xml, sub)
- sub
- end
-
- def convert_from_json(json)
- sub = struct.new
- @schema.from_json(json, sub)
- sub
- end
-
- def convert_to_xml(model)
- xml = {}
- @schema.to_xml(model, xml)
- xml
- end
-
- def convert_to_json(model)
- json = {}
- @schema.to_json(model, json)
- json
- end
-
- private
- def struct
- cname = "CIMI_#{json_name.upcase_first}"
- if ::Struct.const_defined?(cname)
- ::Struct.const_get(cname)
- else
- ::Struct.new("CIMI_#{json_name.upcase_first}",
- *@schema.attribute_names)
- end
- end
- end
-
- class Array < Attribute
- # For an array :things, we collect all <thing/> elements (XmlSimple
- # actually does the collecting)
- def initialize(name, opts = {}, &block)
- opts[:xml_name] = name.to_s.singularize unless opts[:xml_name]
- super(name, opts)
- @struct = Struct.new(name, opts, &block)
- end
-
- def from_xml(xml, model)
- model[name] = (xml[xml_name] || []).map { |elt| @struct.convert_from_xml(elt) }
- end
-
- def from_json(json, model)
- model[name] = (json[json_name] || []).map { |elt| @struct.convert_from_json(elt) }
- end
-
- def to_xml(model, xml)
- ary = (model[name] || []).map { |elt| @struct.convert_to_xml(elt) }
- xml[xml_name] = ary unless ary.empty?
- end
-
- def to_json(model, json)
- ary = (model[name] || []).map { |elt| @struct.convert_to_json(elt) }
- json[json_name] = ary unless ary.empty?
- end
- end
-
- class Hash < Attribute
-
- def initialize(name, opts = {}, &block)
- opts[:json_name] = name.to_s.pluralize unless opts[:json_name]
- super(name, opts)
- @struct = Struct.new(name, opts, &block)
- end
-
- def from_xml(xml, model)
- model[name] = (xml[xml_name] || []).map { |elt| @struct.convert_from_xml(elt) }
- end
-
- def from_json(json, model)
- model[name] = (json[json_name] || {}).inject([]) do |result,item|
- result << @struct.convert_from_json({ 'name' => item[0], 'value' => item[1] })
- end
- end
-
- def to_xml(model, xml)
- ary = (model[name] || []).map { |elt| @struct.convert_to_xml(elt) }
- xml[xml_name] = ary unless ary.empty?
- end
-
- def to_json(model, json)
- ary = (model[name] || []).map { |elt| @struct.convert_to_json(elt) }
- json[json_name] = ary.inject({}) { |result, item| result[item['name']] = item['value']; result } unless ary.empty?
- end
- end
-
- #
- # The actual Schema class
- #
- def initialize
- @attributes = []
- end
-
- def from_xml(xml, model = {})
- @attributes.freeze
- @attributes.each { |attr| attr.from_xml(xml, model) }
- model
- end
-
- def from_json(json, model = {})
- @attributes.freeze
- @attributes.each { |attr| attr.from_json(json, model) }
- model
- end
-
- def to_xml(model, xml = {})
- @attributes.freeze
- @attributes.each { |attr| attr.to_xml(model, xml) }
- xml
- end
-
- def to_json(model, json = {})
- @attributes.freeze
- @attributes.each { |attr| attr.to_json(model, json) }
- json
- end
-
- def attribute_names
- @attributes.map { |a| a.name }
- end
-
- #
- # The DSL
- #
- # Requires that the class into which this is included has a
- # +add_attributes!+ method
- module DSL
- def href(*args)
- args.each { |arg| struct(arg) { scalar :href } }
- end
-
- def text(*args)
- args.expand_opts!(:text => :nested)
- scalar(*args)
- end
-
- def scalar(*args)
- add_attributes!(args, Scalar)
- end
-
- def array(name, opts={}, &block)
- add_attributes!([name, opts], Array, &block)
- end
-
- def struct(name, opts={}, &block)
- add_attributes!([name, opts], Struct, &block)
- end
-
- def hash(name, opts={}, &block)
- add_attributes!([name, opts], Hash, &block)
- end
- end
-
- include DSL
-
- def add_attributes!(args, attr_klass, &block)
- raise "The schema has already been used to convert objects" if @attributes.frozen?
- opts = args.extract_opts!
- args.each { |arg| @attributes << attr_klass.new(arg, opts, &block) }
- end
-end
diff --git a/server/lib/cimi/model/volume.rb b/server/lib/cimi/model/volume.rb
deleted file mode 100644
index 0a232d5..0000000
--- a/server/lib/cimi/model/volume.rb
+++ /dev/null
@@ -1,103 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::Volume < CIMI::Model::Base
-
- struct :capacity do
- scalar :quantity
- scalar :units
- end
- text :bootable
- text :supports_snapshots
- array :snapshots do
- scalar :ref
- end
- text :guest_interface
- array :meters do
- scalar :ref
- end
- href :eventlog
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- volumes = []
- opts = ( id == :all ) ? {} : { :id => id }
- volumes = self.driver.storage_volumes(context.credentials, opts)
- volumes.collect!{ |volume| from_storage_volume(volume, context) }
- return volumes.first unless volumes.length > 1
- return volumes
- end
-
- def self.all(context); find(:all, context); end
-
- def self.create_from_json(json_in, context)
- json = JSON.parse(json_in)
- volume_config_id = json["volumeTemplate"]["volumeConfig"]["href"].split("/").last
- volume_image_id = (json["volumeTemplate"].has_key?("volumeImage") ?
- json["volumeTemplate"]["volumeImage"]["href"].split("/").last : nil)
- create_volume({:volume_config_id=>volume_config_id, :volume_image_id=>volume_image_id}, context)
- end
-
- def self.create_from_xml(xml_in, context)
- xml = XmlSimple.xml_in(xml_in)
- volume_config_id = xml["volumeTemplate"][0]["volumeConfig"][0]["href"].split("/").last
- volume_image_id = (xml["volumeTemplate"][0].has_key?("volumeImage") ?
- xml["volumeTemplate"][0]["volumeImage"][0]["href"].split("/").last : nil)
- create_volume({:volume_config_id=>volume_config_id, :volume_image_id=>volume_image_id}, context)
- end
-
- def self.delete!(id, context)
- context.driver.destroy_storage_volume(context.credentials, {:id=>id} )
- end
-
- def self.find_to_attach_from_json(json_in, context)
- json = JSON.parse(json_in)
- volumes = json["volumes"].map{|v| {:volume=>self.find(v["volume"]["href"].split("/volumes/").last, context),
- :attachment_point=>v["attachmentPoint"] }}
- end
-
- def self.find_to_attach_from_xml(xml_in, context)
- xml = XmlSimple.xml_in(xml_in)
- volumes = xml["volume"].map{|v| {:volume => self.find(v["href"].split("/volumes/").last, context),
- :attachment_point=>v["attachmentPoint"] }}
- end
-
- private
-
- def self.create_volume(params, context)
- volume_config = VolumeConfiguration.find(params[:volume_config_id], context)
- opts = {:capacity=>volume_config.capacity[:quantity], :snapshot_id=>params[:volume_image_id] }
- storage_volume = self.driver.create_storage_volume(context.credentials, opts)
- from_storage_volume(storage_volume, context)
- end
-
- def self.from_storage_volume(volume, context)
- self.new( { :name => volume.id,
- :description => volume.id,
- :created => volume.created,
- :id => context.volume_url(volume.id),
- :capacity => { :quantity=>volume.capacity, :units=>"gibibyte" }, #FIXME... units will vary
- :bootable => "false", #fixme ... will vary... ec2 doesn't expose this
- :supports_snapshots => "true", #fixme, will vary (true for ec2)
- :snapshots => [], #fixme...
- :guest_interface => "",
- :eventlog => {:href=> "http://eventlogs"},#FIXME
- :meters => []
- } )
- end
-
-end
diff --git a/server/lib/cimi/model/volume_collection.rb b/server/lib/cimi/model/volume_collection.rb
deleted file mode 100644
index d5053c7..0000000
--- a/server/lib/cimi/model/volume_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VolumeCollection < CIMI::Model::Base
-
- act_as_root_entity :volume
-
- array :volumes do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.volumes_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} VolumeCollection",
- :volumes => Volume.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/volume_configuration.rb b/server/lib/cimi/model/volume_configuration.rb
deleted file mode 100644
index 75b37ea..0000000
--- a/server/lib/cimi/model/volume_configuration.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VolumeConfiguration < CIMI::Model::Base
-
- text :format
- struct :capacity do
- scalar :quantity
- scalar :units
- end
- text :supports_snapshots
- text :guest_interface
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- volume_configs = []
- if id == :all
- #ec2 ebs volumes can 1gb..1tb
- (1..1000).each do |size|
- volume_configs << create(size, context)
- end
- else
- volume_configs << create(id, context)
- return volume_configs.first
- end
- return volume_configs
- end
-
-
- def self.all(context); find(:all, context); end
-
- private
-
- def self.create(size, context)
- self.new( {
- :id => context.volume_configuration_url(size),
- :name => size,
- :description => "volume configuration with #{size} GiB",
- :created => Time.now.to_s,
- :capacity => {:quantity=>size, :units=>"gibibytes"},
- :supports_snapshots => "true"
- # FIXME :guest_interface => "NFS"
- } )
- end
-
-end
diff --git a/server/lib/cimi/model/volume_configuration_collection.rb b/server/lib/cimi/model/volume_configuration_collection.rb
deleted file mode 100644
index ace31bf..0000000
--- a/server/lib/cimi/model/volume_configuration_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VolumeConfigurationCollection < CIMI::Model::Base
-
- act_as_root_entity :volume_configuration
-
- array :volume_configurations do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.volume_configurations_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} VolumeConfigurationCollection",
- :volume_configurations => VolumeConfiguration.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/volume_image.rb b/server/lib/cimi/model/volume_image.rb
deleted file mode 100644
index 03cc7fd..0000000
--- a/server/lib/cimi/model/volume_image.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VolumeImage < CIMI::Model::Base
-
- href :image_location
- text :image_data
- text :bootable
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- storage_snapshots = []
- opts = ( id==:all ) ? {} : { :id=>id }
- storage_snapshots = self.driver.storage_snapshots(context.credentials, opts)
- storage_snapshots.collect!{ |snapshot| from_storage_snapshot(snapshot, context) }
- return storage_snapshots.first unless storage_snapshots.length > 1
- return storage_snapshots
- end
-
- def self.all(context); find(:all, context); end
-
- private
-
- def self.from_storage_snapshot(snapshot, context)
- self.new( {
- :name => snapshot.id,
- :description => snapshot.id,
- :created => snapshot.created,
- :id => context.volume_image_url(snapshot.id),
- :image_location => {:href=>context.volume_url(snapshot.storage_volume_id)},
- :bootable => "false" #FIXME
- } )
- end
-
-end
diff --git a/server/lib/cimi/model/volume_image_collection.rb b/server/lib/cimi/model/volume_image_collection.rb
deleted file mode 100644
index 0172c04..0000000
--- a/server/lib/cimi/model/volume_image_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VolumeImageCollection < CIMI::Model::Base
-
- act_as_root_entity :volume_image
-
- array :volume_images do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.volume_images_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} VolumeImageCollection",
- :volume_images => VolumeImage.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/volume_template.rb b/server/lib/cimi/model/volume_template.rb
deleted file mode 100644
index b9c82db..0000000
--- a/server/lib/cimi/model/volume_template.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VolumeTemplate < CIMI::Model::Base
-
- href :volume_config
- href :volume_image
- array :operations do
- scalar :rel, :href
- end
-end
diff --git a/server/lib/cimi/model/volume_template_collection.rb b/server/lib/cimi/model/volume_template_collection.rb
deleted file mode 100644
index 6b6e4ac..0000000
--- a/server/lib/cimi/model/volume_template_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VolumeTemplateCollection < CIMI::Model::Base
-
- act_as_root_entity :volume_template
-
- array :volume_templates do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.volume_template_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} VolumeTemplateCollection",
- :volume_templates => VolumeTemplate.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/vsp.rb b/server/lib/cimi/model/vsp.rb
deleted file mode 100644
index 40a526f..0000000
--- a/server/lib/cimi/model/vsp.rb
+++ /dev/null
@@ -1,102 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VSP < CIMI::Model::Base
-
- text :state
-
- href :network
-
- text :bandwidth_reservation
-
- text :traffic_priority
-
- text :max_traffic_delay
-
- text :max_traffic_loss
-
- text :max_traffic_jitter
-
- href :event_log
-
- array :meters do
- scalar :href
- end
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- if id==:all
- context.driver.vsps(context.credentials, {:env=>context})
- else
- context.driver.vsps(context.credentials, {:id=>id, :env=>context})
- end
- end
-
- def self.create(request_body, context, type)
- input = (type == :xml)? XmlSimple.xml_in(request_body, {"ForceArray"=>false, "NormaliseSpace"=>2}) : JSON.parse(request_body)
- if input["vspTemplate"]["href"] #template by reference
- vsp_config, network = get_by_reference(input, context)
- else
- if input["vspTemplate"]["vspConfig"]["href"] # configuration by reference
- vsp_config = VSPConfiguration.find(context.href_id(input["vspTemplate"]["vspConfig"]["href"],:vsp_configurations), context)
- else #configuration by value
- vsp_config = get_by_value(request_body, type)
- end
- network = Network.find(context.href_id(input["vspTemplate"]["network"]["href"], :networks), context)
- end
- params = {:vsp_config => vsp_config, :network => network, :name=>input["name"], :description=>input["description"], :env=>context}
- raise CIMI::Model::BadRequest.new("Bad request - missing required parameters. Client sent: #{request_body} which produced #{params.inspect}") if params.has_value?(nil)
- context.driver.create_vsp(context.credentials, params)
- end
-
- def self.delete!(id, context)
- context.driver.delete_vsp(context.credentials, id)
- end
-
- def perform(action, context, &block)
- begin
- if context.driver.send(:"#{action.name}_vsp", context.credentials, self.name)
- block.callback :success
- else
- raise "Operation #{action.name} failed to execute on the VSP #{self.name} "
- end
- rescue => e
- block.callback :failure, e.message
- end
- end
-
-
- private
-
- def self.get_by_reference(input, context)
- vsp_template = VSPTemplate.find(context.href_id(input["vspTemplate"]["href"], :vsp_templates), context)
- vsp_config = VSPConfiguration.find(context.href_id(vsp_template.vsp_config.href, :vsp_configurations), context)
- network = Network.find(context.href_id(vsp_template.network.href, :networks), context)
- return vsp_config, network
- end
-
- def self.get_by_value(request_body, type)
- if type == :xml
- xml_arrays = XmlSimple.xml_in(request_body, {"NormaliseSpace"=>2})
- vsp_config = VSPConfiguration.from_xml(XmlSimple.xml_out(xml_arrays["vspTemplate"][0]["vspConfig"][0]))
- else
- json = JSON.parse(request_body)
- vsp_config = VSPConfiguration.from_json(JSON.generate(json["vspTemplate"]["vspConfig"]))
- end
- end
-end
diff --git a/server/lib/cimi/model/vsp_collection.rb b/server/lib/cimi/model/vsp_collection.rb
deleted file mode 100644
index 6f659e1..0000000
--- a/server/lib/cimi/model/vsp_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VSPCollection < CIMI::Model::Base
-
- CIMI::Model.register_as_root_entity! "VSPs"
-
- array :vsps do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.vsps_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} VSPCollection",
- :vsps => VSP.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/vsp_configuration.rb b/server/lib/cimi/model/vsp_configuration.rb
deleted file mode 100644
index c9a9bf3..0000000
--- a/server/lib/cimi/model/vsp_configuration.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VSPConfiguration < CIMI::Model::Base
-
- text :bandwidth_reservation
-
- text :traffic_priority
-
- text :max_traffic_delay
-
- text :max_traffic_loss
-
- text :max_traffic_jitter
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- if id==:all
- context.driver.vsp_configurations(context.credentials, {:env=>context})
- else
- context.driver.vsp_configurations(context.credentials, {:env=>context, :id=>id})
- end
- end
-
-end
diff --git a/server/lib/cimi/model/vsp_configuration_collection.rb b/server/lib/cimi/model/vsp_configuration_collection.rb
deleted file mode 100644
index addff1c..0000000
--- a/server/lib/cimi/model/vsp_configuration_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VSPConfigurationCollection < CIMI::Model::Base
-
- CIMI::Model.register_as_root_entity! "VSPConfigurations"
-
- array :vsp_configurations do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.vsp_configurations_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} VSPConfigurationCollection",
- :vsp_configurations => VSPConfiguration.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/model/vsp_template.rb b/server/lib/cimi/model/vsp_template.rb
deleted file mode 100644
index f1b8078..0000000
--- a/server/lib/cimi/model/vsp_template.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VSPTemplate < CIMI::Model::Base
-
- href :network
-
- href :vsp_config
-
- array :operations do
- scalar :rel, :href
- end
-
- def self.find(id, context)
- if id==:all
- context.driver.vsp_templates(context.credentials, {:env=>context})
- else
- context.driver.vsp_templates(context.credentials, {:env=>context, :id=>id})
- end
- end
-
-end
diff --git a/server/lib/cimi/model/vsp_template_collection.rb b/server/lib/cimi/model/vsp_template_collection.rb
deleted file mode 100644
index 4acb74e..0000000
--- a/server/lib/cimi/model/vsp_template_collection.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-class CIMI::Model::VSPTemplateCollection < CIMI::Model::Base
-
- CIMI::Model.register_as_root_entity! "VSPTemplates"
-
- array :vsp_templates do
- scalar :href
- end
-
- def self.default(context)
- self.new(
- :id => context.vsp_templates_url,
- :name => 'default',
- :created => Time.now,
- :description => "#{context.driver.name.capitalize} VSPTemplateCollection",
- :vsp_templates => VSPTemplate.all_uri(context)
- )
- end
-
-end
diff --git a/server/lib/cimi/models.rb b/server/lib/cimi/models.rb
new file mode 100644
index 0000000..b0793ee
--- /dev/null
+++ b/server/lib/cimi/models.rb
@@ -0,0 +1,75 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless require_relatived by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+require_relative '../deltacloud/drivers/features'
+
+# Declare namespace for CIMI models
+#
+
+module CIMI
+ module Model; end
+
+ class FakeCollection
+ extend Sinatra::Rabbit::Features
+ include Deltacloud::InstanceFeatures
+ end
+end
+
+require_relative './models/schema'
+require_relative './models/base'
+require_relative './models/errors'
+require_relative './models/entity_metadata'
+require_relative './models/entity_metadata_collection'
+require_relative './models/cloud_entry_point'
+require_relative './models/machine_template'
+require_relative './models/machine_image'
+require_relative './models/machine_configuration'
+require_relative './models/action'
+require_relative './models/machine'
+require_relative './models/volume'
+require_relative './models/machine_admin'
+require_relative './models/volume_configuration'
+require_relative './models/volume_image'
+require_relative './models/volume_template'
+require_relative './models/machine_template_collection'
+require_relative './models/machine_image_collection'
+require_relative './models/machine_configuration_collection'
+require_relative './models/machine_collection'
+require_relative './models/volume_collection'
+require_relative './models/machine_admin_collection'
+require_relative './models/volume_configuration_collection'
+require_relative './models/volume_image_collection'
+require_relative './models/volume_template_collection'
+require_relative './models/network'
+require_relative './models/network_collection'
+require_relative './models/network_configuration'
+require_relative './models/network_configuration_collection'
+require_relative './models/network_template'
+require_relative './models/network_template_collection'
+require_relative './models/routing_group'
+require_relative './models/routing_group_collection'
+require_relative './models/routing_group_template'
+require_relative './models/routing_group_template_collection'
+require_relative './models/vsp'
+require_relative './models/vsp_collection'
+require_relative './models/vsp_configuration'
+require_relative './models/vsp_configuration_collection'
+require_relative './models/vsp_template'
+require_relative './models/vsp_template_collection'
+require_relative './models/address'
+require_relative './models/address_collection'
+require_relative './models/address_template'
+require_relative './models/address_template_collection'
diff --git a/server/lib/cimi/models/action.rb b/server/lib/cimi/models/action.rb
new file mode 100644
index 0000000..c1c9908
--- /dev/null
+++ b/server/lib/cimi/models/action.rb
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::Action < CIMI::Model::Base
+
+ text :action
+
+ def name
+ action.split('/').last.strip.intern
+ end
+
+end
diff --git a/server/lib/cimi/models/address.rb b/server/lib/cimi/models/address.rb
new file mode 100644
index 0000000..f9e10a1
--- /dev/null
+++ b/server/lib/cimi/models/address.rb
@@ -0,0 +1,72 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::Address < CIMI::Model::Base
+
+ text :ip
+
+ text :hostname
+
+ text :allocation
+
+ text :default_gateway
+
+ text :dns
+
+ text :mac_address
+
+ text :protocol
+
+ text :mask
+
+ href :network
+
+ href :resource
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ if id==:all
+ context.driver.addresses(context.credentials, {:env=>context})
+ else
+ context.driver.addresses(context.credentials, {:id=>id, :env=>context})
+ end
+ end
+
+ def self.create(request_body, context, type)
+ input = (type == :xml)? XmlSimple.xml_in(request_body, {"ForceArray"=>false, "NormaliseSpace"=>2}) : JSON.parse(request_body)
+ if input["addressTemplate"]["href"] #by reference
+ address_template = CIMI::Model::AddressTemplate.find(context.href_id(input["addressTemplate"]["href"], :address_templates), context)
+ else
+ case type
+ when :json
+ address_template = CIMI::Model::AddressTemplate.from_json(JSON.generate(input["addressTemplate"]))
+ when :xml
+ xml = XmlSimple.xml_in(request_body, {"NormaliseSpace"=>2})
+ address_template = CIMI::Model::AddressTemplate.from_xml(XmlSimple.xml_out(xml["addressTemplate"][0]))
+ end
+ end
+ params = {:name=>input["name"], :description=>input["description"], :address_template=>address_template, :env=>context }
+ raise CIMI::Model::BadRequest.new("Bad request - missing required parameters. Client sent: #{request_body} which produced #{params.inspect}") if params.has_value?(nil)
+ context.driver.create_address(context.credentials, params)
+ end
+
+ def self.delete!(id, context)
+ context.driver.delete_address(context.credentials, id)
+ end
+
+end
diff --git a/server/lib/cimi/models/address_collection.rb b/server/lib/cimi/models/address_collection.rb
new file mode 100644
index 0000000..eef6c51
--- /dev/null
+++ b/server/lib/cimi/models/address_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::AddressCollection < CIMI::Model::Base
+
+ act_as_root_entity :address
+
+ array :addresses do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.addresses_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} AddressCollection",
+ :addresses => CIMI::Model::Address.all(context).map { |addr| { :href => addr.id } }
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/address_template.rb b/server/lib/cimi/models/address_template.rb
new file mode 100644
index 0000000..9d2c409
--- /dev/null
+++ b/server/lib/cimi/models/address_template.rb
@@ -0,0 +1,54 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::AddressTemplate < CIMI::Model::Base
+
+ text :ip
+
+ text :hostname
+
+ text :allocation
+
+ text :default_gateway
+
+ text :dns
+
+ text :mac_address
+
+ text :protocol
+
+ text :mask
+
+ href :network
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ if id==:all
+ context.driver.address_templates(context.credentials, {:env=>context})
+ else
+ context.driver.address_templates(context.credentials, {:id=>id, :env=>context})
+ end
+ end
+
+ def self.create(request_body, context, type)
+ end
+
+ def self.delete!(id, context)
+ end
+
+end
diff --git a/server/lib/cimi/models/address_template_collection.rb b/server/lib/cimi/models/address_template_collection.rb
new file mode 100644
index 0000000..3bb95cd
--- /dev/null
+++ b/server/lib/cimi/models/address_template_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::AddressTemplateCollection < CIMI::Model::Base
+
+ act_as_root_entity :address_template
+
+ array :address_templates do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.address_templates_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} AddressTemplateCollection",
+ :address_templates => CIMI::Model::AddressTemplate.all(context).map { |addr| { :href => addr.id } }
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/base.rb b/server/lib/cimi/models/base.rb
new file mode 100644
index 0000000..16812ac
--- /dev/null
+++ b/server/lib/cimi/models/base.rb
@@ -0,0 +1,249 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+require 'xmlsimple'
+require 'json'
+
+# The base class for any CIMI object that we either read from a request or
+# write as a response. This class handles serializing/deserializing XML and
+# JSON into a common form.
+#
+# == Defining the schema
+#
+# The conversion of XML and JSON into internal objects is based on a schema
+# that is defined through a DSL:
+#
+# class Machine < CIMI::Model::Base
+# text :status
+# href :meter
+# array :volumes do
+# scalar :href, :attachment_point, :protocol
+# end
+# end
+#
+# The DSL automatically takes care of converting identifiers from their
+# underscored form to the camel-cased form used by CIMI. The above class
+# can be used in the following way:
+#
+# machine = Machine.from_xml(some_xml)
+# if machine.status == "UP"
+# ...
+# end
+# sda = machine.volumes.find { |v| v.attachment_point == "/dev/sda" }
+# handle_meter(machine.meter.href)
+#
+# The keywords for the DSL are
+# [scalar(names, ...)]
+# Define a scalar attribute; in JSON, this is represented as a string
+# property. In XML, this can be represented in a number of ways,
+# depending on whether the option :text is set:
+# * :text not set: attribute on the enclosing element
+# * :text == :direct: the text content of the enclosing element
+# * :text == :nested: the text content of an element +<name>...</name>+
+# [text(names)]
+# A shorthand for +scalar(names, :text => :nested)+, i.e., for
+# attributes that in XML are represented by their own tags
+# [href(name)]
+# A shorthand for +struct name { scalar :href }+; in JSON, this is
+# represented as +{ name: { "href": string } }+, and in XML as +<name
+# href="..."/>+
+# [struct(name, opts, &block)]
+# A structured subobject; the block defines the schema of the
+# subobject. The +:content+ option can be used to specify the attribute
+# that should receive the content of hte corresponding XML element
+# [array(name, opts, &block)]
+# An array of structured subobjects; the block defines the schema of
+# the subobjects.
+
+module CIMI::Model
+
+ def self.register_as_root_entity!(name)
+ @root_entities ||= []
+ @root_entities << name
+ unless CIMI::Model::CloudEntryPoint.href_defined?(name)
+ CIMI::Model::CloudEntryPoint.send(:href, name.underscore)
+ end
+ end
+
+ def self.root_entities
+ @root_entities || []
+ end
+
+end
+
+class CIMI::Model::Base
+
+ #
+ # We keep the values of the attributes in a hash
+ #
+ attr_reader :attribute_values
+
+ # Keep the list of all attributes in an array +attributes+; for each
+ # attribute, we also define a getter and a setter to access/change the
+ # value for that attribute
+ class << self
+ def base_schema
+ @schema ||= CIMI::Model::Schema.new
+ end
+
+ def clone_base_schema
+ @schema_duped = true
+ @schema = Marshal::load(Marshal.dump(superclass.base_schema))
+ end
+
+ def base_schema_cloned?
+ @schema_duped
+ end
+
+ private :'clone_base_schema', :'base_schema_cloned?'
+
+ def inherited(child)
+ child.instance_eval do
+ def schema
+ base_schema_cloned? ? @schema : clone_base_schema
+ end
+ end
+ end
+
+ def add_attributes!(names, attr_klass, &block)
+ if self.respond_to? :schema
+ schema.add_attributes!(names, attr_klass, &block)
+ else
+ base_schema.add_attributes!(names, attr_klass, &block)
+ end
+ names.each do |name|
+ define_method(name) { @attribute_values[name] }
+ define_method(:"#{name}=") { |newval| @attribute_values[name] = newval }
+ end
+ end
+
+ # Return Array of links to current CIMI object
+ def all_uri(context)
+ self.all(context).map { |e| { :href => e.id } }
+ end
+ end
+
+ extend CIMI::Model::Schema::DSL
+
+ def [](a)
+ @attribute_values[a]
+ end
+
+ def []=(a, v)
+ @attribute_values[a] = v
+ end
+
+ #
+ # Factory methods
+ #
+ def initialize(values = {})
+ @attribute_values = values
+ end
+
+ # Construct a new object from the XML representation +xml+
+ def self.from_xml(text)
+ xml = XmlSimple.xml_in(text, :force_content => true)
+ model = self.new
+ @schema.from_xml(xml, model)
+ model
+ end
+
+ # Construct a new object
+ def self.from_json(text)
+ json = JSON::parse(text)
+ model = self.new
+ @schema.from_json(json, model)
+ model
+ end
+
+ #
+ # Serialize
+ #
+
+ def self.xml_tag_name
+ self.name.split("::").last
+ end
+
+ def self.to_json(model)
+ JSON::unparse(@schema.to_json(model))
+ end
+
+ def self.to_xml(model)
+ xml = @schema.to_xml(model)
+ xml["xmlns"] = "http://www.dmtf.org/cimi"
+ XmlSimple.xml_out(xml, :root_name => xml_tag_name)
+ end
+
+ def to_json
+ self.class.to_json(self)
+ end
+
+ def to_xml
+ self.class.to_xml(self)
+ end
+
+ #
+ # Common attributes for all resources
+ #
+ text :id, :name, :description, :created
+
+ # FIXME: this doesn't match with JSON
+ hash :property, :content => :value do
+ scalar :name
+ end
+
+ def self.act_as_root_entity(name=nil)
+ if name
+ name = name.to_s.camelize.pluralize
+ else
+ name = xml_tag_name.pluralize.uncapitalize
+ end
+ CIMI::Model.register_as_root_entity! name
+ end
+
+ def self.all(_self); find(:all, _self); end
+
+ def filter_by(filter_opts)
+ return self if filter_opts.nil?
+ return filter_attributes(filter_opts.split(',').map{ |a| a.intern }) if filter_opts.include? ','
+ case filter_opts
+ when /^([\w\_]+)$/ then filter_attributes([$1.intern])
+ when /^([\w\_]+)\[(\d+\-\d+)\]$/ then filter_by_arr_range($1.intern, $2)
+ when /^([\w\_]+)\[(\d+)\]$/ then filter_by_arr_index($1.intern, $2)
+ else self
+ end
+ end
+
+ private
+
+ def filter_attributes(attr_list)
+ attrs = attr_list.inject({}) do |result, attr|
+ result[attr] = self.send(attr) if self.respond_to?(attr)
+ result
+ end
+ self.class.new(attrs)
+ end
+
+ def filter_by_arr_index(attr, filter)
+ return self unless self.respond_to?(attr)
+ self.class.new(attr => [self.send(attr)[filter.to_i]])
+ end
+
+ def filter_by_arr_range(attr, filter)
+ return self unless self.respond_to?(attr)
+ filter = filter.split('-').inject { |s,e| s.to_i..e.to_i }
+ self.class.new(attr => self.send(attr)[filter])
+ end
+end
diff --git a/server/lib/cimi/models/cloud_entry_point.rb b/server/lib/cimi/models/cloud_entry_point.rb
new file mode 100644
index 0000000..ffe1ef5
--- /dev/null
+++ b/server/lib/cimi/models/cloud_entry_point.rb
@@ -0,0 +1,46 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::CloudEntryPoint < CIMI::Model::Base
+
+ array :entity_metadata do
+ scalar :href
+ end
+
+ def self.create(context)
+ self.new(entities(context).merge({
+ :name => context.driver.name,
+ :description => "Cloud Entry Point for the Deltacloud #{context.driver.name} driver",
+ :id => context.cloudEntryPoint_url,
+ :created => Time.now,
+ :entity_metadata => CIMI::Model::EntityMetadata.all_uri(context)
+ }))
+ end
+
+ # Return an Hash of the CIMI root entities used in CloudEntryPoint
+ def self.entities(context)
+ CIMI::Model.root_entities.inject({}) do |result, entity|
+ result[entity.underscore] = { :href => context.send(:"#{entity.underscore}_url") }
+ result
+ end
+ end
+
+ private
+
+ def self.href_defined?(entity)
+ true if schema.attribute_names.include? entity.underscore
+ end
+
+end
diff --git a/server/lib/cimi/models/entity_metadata.rb b/server/lib/cimi/models/entity_metadata.rb
new file mode 100644
index 0000000..5455c75
--- /dev/null
+++ b/server/lib/cimi/models/entity_metadata.rb
@@ -0,0 +1,84 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+
+class CIMI::Model::EntityMetadata < CIMI::Model::Base
+
+ text :type_uri
+
+ array :attributes do
+ scalar :name
+ scalar :namespace
+ scalar :type
+ scalar :required
+ scalar :constraints
+ end
+
+ array :operations do
+ scalar :name
+ scalar :uri
+ scalar :description
+ scalar :method
+ scalar :input_message
+ scalar :output_message
+ end
+
+ def self.find(id, context)
+ entity_metadata = []
+ if id == :all
+ CIMI::Model.root_entities.each do |entity|
+ entity_class = CIMI::Model.const_get("#{entity.singularize}")
+ entity_metadata << entity_class.create_entity_metadata(context) if entity_class.respond_to?(:create_entity_metadata)
+ end
+ return entity_metadata
+ else
+ entity_class = CIMI::Model.const_get("#{id.camelize}")
+ if entity_class.respond_to?(:create_entity_metadata)
+ entity_class.create_entity_metadata(context)
+ end
+ end
+ end
+
+ def self.metadata_from_deltacloud_features(cimi_entity, dcloud_entity, context)
+ deltacloud_features = context.driver.class.features_for(dcloud_entity)
+ metadata_attributes = deltacloud_features.map{|f| attributes_from_feature(f)}
+ from_feature(cimi_entity, context, metadata_attributes.flatten!)
+ end
+
+ def includes_attribute?(attribute)
+ self.attributes.any?{|attr| attr[:name] == attribute}
+ end
+
+ private
+
+ def self.attributes_from_feature(feature)
+ feature = CIMI::FakeCollection.feature(feature)
+ feature.operations.first.params_array.map do |p|
+ {
+ :name=> p.name,
+ :type=> "xs:string",
+ :required=> p.required? ? "true" : "false",
+ :constraints=> (feature.constraints.empty? ? (feature.description.nil? ? "" : feature.description): feature.constraints)
+ }
+ end
+ end
+
+ def self.from_feature(cimi_entity, context, metadata_attributes)
+ self.new(:name => cimi_entity, :uri=>"#{context.entity_metadata_url}/#{cimi_entity.underscore}",
+ :type_uri=> context.send("#{cimi_entity.pluralize.underscore}_url"),
+ :attributes => metadata_attributes)
+ end
+
+end
diff --git a/server/lib/cimi/models/entity_metadata_collection.rb b/server/lib/cimi/models/entity_metadata_collection.rb
new file mode 100644
index 0000000..595b502
--- /dev/null
+++ b/server/lib/cimi/models/entity_metadata_collection.rb
@@ -0,0 +1,31 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::EntityMetadataCollection < CIMI::Model::Base
+
+ array :entity_metadata do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.entity_metadata_url,
+ :name => 'default',
+ :created => Time.now,
+ :entity_metadata => CIMI::Model::EntityMetadata.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/errors.rb b/server/lib/cimi/models/errors.rb
new file mode 100644
index 0000000..7c090ed
--- /dev/null
+++ b/server/lib/cimi/models/errors.rb
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CIMI::Model
+
+ class NotFound < StandardError
+ attr_accessor :code
+
+ def initialize
+ super("Requested Entity Not Found")
+ self.code = 404
+ end
+
+ end
+
+ class BadRequest < StandardError
+ attr_accessor :code
+ def initialize(msg="")
+ super(msg)
+ self.code=400
+ end
+ end
+
+ class NotImplemented < StandardError
+ attr_accessor :code
+
+ def initialize
+ super("Requested operation is not implemented by backend provider")
+ self.code = 501
+ end
+
+ end
+
+end
+
+
diff --git a/server/lib/cimi/models/machine.rb b/server/lib/cimi/models/machine.rb
new file mode 100644
index 0000000..0540bd8
--- /dev/null
+++ b/server/lib/cimi/models/machine.rb
@@ -0,0 +1,227 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::Machine < CIMI::Model::Base
+
+ text :state
+ text :cpu
+
+ struct :memory do
+ scalar :quantity
+ scalar :units
+ end
+
+ href :event_log
+
+ array :disks do
+ struct :capacity do
+ scalar :quantity
+ scalar :units
+ end
+ scalar :format
+ scalar :attachment_point
+ end
+
+ array :volumes do
+ scalar :href
+ scalar :protocol
+ scalar :attachment_point
+ end
+
+ array :network_interfaces do
+ href :vsp
+ text :hostname, :mac_address, :state, :protocol, :allocation
+ text :address, :default_gateway, :dns, :max_transmission_unit
+ end
+
+ array :meters do
+ scalar :href
+ end
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ instances = []
+ if id == :all
+ instances = context.driver.instances(context.credentials)
+ instances.map { |instance| from_instance(instance, context) }.compact
+ else
+ instance = context.driver.instance(context.credentials, :id => id)
+ raise CIMI::Model::NotFound unless instance
+ from_instance(instance, context)
+ end
+ end
+
+ def self.create_from_json(body, context)
+ json = JSON.parse(body)
+ hardware_profile_id = xml['machineTemplate']['machineConfig']["href"].split('/').last
+ image_id = xml['machineTemplate']['machineImage']["href"].split('/').last
+ instance = context.create_instance(context.credentials, image_id, { :hwp_id => hardware_profile_id })
+ from_instance(instance, context)
+ end
+
+ def self.create_from_xml(body, context)
+ xml = XmlSimple.xml_in(body)
+ machine_template = xml['machineTemplate'][0]
+ hardware_profile_id = machine_template['machineConfig'][0]["href"].split('/').last
+ image_id = machine_template['machineImage'][0]["href"].split('/').last
+ additional_params = {}
+ additional_params[:name] =xml['name'][0] if xml['name']
+ if machine_template.has_key? 'machineAdmin'
+ additional_params[:keyname] = machine_template['machineAdmin'][0]["href"].split('/').last
+ end
+ instance = context.driver.create_instance(context.credentials, image_id, {
+ :hwp_id => hardware_profile_id
+ }.merge(additional_params))
+ from_instance(instance, context)
+ end
+
+ def perform(action, context, &block)
+ begin
+ if context.driver.send(:"#{action.name}_instance", context.credentials, self.name)
+ block.callback :success
+ else
+ raise "Operation failed to execute on given Machine"
+ end
+ rescue => e
+ block.callback :failure, e.message
+ end
+ end
+
+ def self.delete!(id, context)
+ context.driver.destroy_instance(context.credentials, id)
+ end
+
+ def self.create_entity_metadata(context)
+ cimi_entity = self.name.split("::").last
+ metadata = CIMI::Model::EntityMetadata.metadata_from_deltacloud_features(cimi_entity, :instances, context)
+ unless metadata.includes_attribute?(:name)
+ metadata.attributes << {:name=>"name", :required=>"false",
+ :constraints=>"Determined by the cloud provider", :type=>"xs:string"}
+ end
+ metadata
+ end
+
+ def self.attach_volumes(volumes, context)
+ volumes.each do |vol|
+ context.driver.attach_storage_volume(context.credentials,
+ {:id=>vol[:volume].name, :instance_id=>context.params[:id], :device=>vol[:attachment_point]})
+ end
+ self.find(context.params[:id], context)
+ end
+
+ def self.detach_volumes(volumes, context)
+ volumes.each do |vol|
+ context.driver.detach_storage_volume(context.credentials, {:id=>vol[:volume].name, :instance_id => context.params[:id]})
+ end
+ self.find(context.params[:id], context)
+ end
+
+ private
+
+ def self.from_instance(instance, context)
+ cpu = memory = disks = (instance.instance_profile.id == "opaque")? "n/a" : nil
+ self.new(
+ :name => instance.id,
+ :description => instance.name,
+ :created => instance.launch_time,
+ :id => context.machine_url(instance.id),
+ :state => convert_instance_state(instance.state),
+ :cpu => cpu || convert_instance_cpu(instance.instance_profile, context),
+ :memory => memory || convert_instance_memory(instance.instance_profile, context),
+ :disks => disks || convert_instance_storage(instance.instance_profile, context),
+ :network_interfaces => convert_instance_addresses(instance),
+ :operations => convert_instance_actions(instance, context),
+ :volumes=>convert_storage_volumes(instance, context),
+ :property => convert_instance_properties(instance, context)
+ )
+ end
+
+ # FIXME: This will convert 'RUNNING' state to 'STARTED'
+ # which is defined in CIMI (p65)
+ #
+ def self.convert_instance_state(state)
+ ('RUNNING' == state) ? 'STARTED' : state
+ end
+
+ def self.convert_instance_properties(instance, context)
+ properties = []
+ properties << { :name => :machine_image, :value => context.machine_image_url(instance.image_id) }
+ if instance.respond_to? :keyname
+ properties << { :name => :machine_admin, :value => context.machine_admin_url(instance.keyname) }
+ end
+ properties
+ end
+
+ def self.convert_instance_cpu(profile, context)
+ cpu_override = profile.overrides.find { |p, v| p == :cpu }
+ if cpu_override.nil?
+ CIMI::Model::MachineConfiguration.find(profile.id, context).cpu
+ else
+ cpu_override[1]
+ end
+ end
+
+ def self.convert_instance_memory(profile, context)
+ machine_conf = CIMI::Model::MachineConfiguration.find(profile.name, context)
+ memory_override = profile.overrides.find { |p, v| p == :memory }
+ {
+ :quantity => memory_override.nil? ? machine_conf.memory[:quantity] : memory_override[1],
+ :units => machine_conf.memory[:units]
+ }
+ end
+
+ def self.convert_instance_storage(profile, context)
+ machine_conf = CIMI::Model::MachineConfiguration.find(profile.name, context)
+ storage_override = profile.overrides.find { |p, v| p == :storage }
+ [
+ { :capacity => {
+ :quantity => storage_override.nil? ? machine_conf.disks.first[:capacity][:quantity] : storage_override[1],
+ :units => machine_conf.disks.first[:capacity][:units]
+ }
+ }
+ ]
+ end
+
+ def self.convert_instance_addresses(instance)
+ (instance.public_addresses + instance.private_addresses).collect do |address|
+ {
+ :hostname => address.is_hostname? ? address : nil,
+ :mac_address => address.is_mac? ? address : nil,
+ :state => 'Active',
+ :protocol => 'IPv4',
+ :address => address.is_ipv4? ? address : nil,
+ :allocation => 'Static'
+ }
+ end
+ end
+
+ def self.convert_instance_actions(instance, context)
+ instance.actions.collect do |action|
+ action = :destroy if action == :delete # In CIMI destroy operation become delete
+ action = :restart if action == :reboot # In CIMI reboot operation become restart
+ { :href => context.send(:"#{action}_machine_url", instance.id), :rel => "http://www.dmtf.org/cimi/action/#{action}" }
+ end
+ end
+
+ def self.convert_storage_volumes(instance, context)
+ instance.storage_volumes ||= [] #deal with nilpointers
+ instance.storage_volumes.map{|vol| {:href=>context.volume_url(vol.keys.first),
+ :attachment_point=>vol.values.first} }
+ end
+
+end
diff --git a/server/lib/cimi/models/machine_admin.rb b/server/lib/cimi/models/machine_admin.rb
new file mode 100644
index 0000000..fed7c80
--- /dev/null
+++ b/server/lib/cimi/models/machine_admin.rb
@@ -0,0 +1,59 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::MachineAdmin < CIMI::Model::Base
+
+ text :username
+ text :password
+ text :key
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ if id == :all
+ keys = context.driver.keys(context.credentials)
+ keys.map { |key| from_key(key, context) }
+ else
+ key = context.driver.key(context.credentials, :id => id)
+ from_key(key, context)
+ end
+ end
+
+ def self.create_from_xml(body, context)
+ machine_admin = MachineAdmin.from_xml(body)
+ key = context.driver.create_key(context.credentials, :key_name => machine_admin.name)
+ from_key(key, context)
+ end
+
+ def self.delete!(id, context)
+ context.driver.destroy_key(context.credentials, :id => id)
+ end
+
+ private
+
+ def self.from_key(key, context)
+ self.new(
+ :name => key.id,
+ :username => key.username,
+ :password => key.is_password? ? key.password : key.fingerprint,
+ :key => key.is_key? ? key.pem_rsa_key : nil,
+ :id => context.machine_admin_url(key.id),
+ :created => Time.now
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/machine_admin_collection.rb b/server/lib/cimi/models/machine_admin_collection.rb
new file mode 100644
index 0000000..08c1559
--- /dev/null
+++ b/server/lib/cimi/models/machine_admin_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::MachineAdminCollection < CIMI::Model::Base
+
+ act_as_root_entity :machine_admin
+
+ array :machine_admins do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.machine_admins_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} MachineAdminCollection",
+ :machine_admins => CIMI::Model::MachineAdmin.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/machine_collection.rb b/server/lib/cimi/models/machine_collection.rb
new file mode 100644
index 0000000..9154aa9
--- /dev/null
+++ b/server/lib/cimi/models/machine_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::MachineCollection < CIMI::Model::Base
+
+ act_as_root_entity :machine
+
+ array :machines do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.machines_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} MachineCollection",
+ :machines => CIMI::Model::Machine.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/machine_configuration.rb b/server/lib/cimi/models/machine_configuration.rb
new file mode 100644
index 0000000..f9d98f2
--- /dev/null
+++ b/server/lib/cimi/models/machine_configuration.rb
@@ -0,0 +1,70 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::MachineConfiguration < CIMI::Model::Base
+
+ struct :memory do
+ scalar :quantity
+ scalar :units
+ end
+
+ text :cpu
+
+ array :disks do
+ struct :capacity do
+ scalar :quantity
+ scalar :units
+ end
+ scalar :format
+ scalar :attachment_point
+ end
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ profiles = []
+ if id == :all
+ profiles = context.driver.hardware_profiles(context.credentials)
+ profiles.map { |profile| from_hardware_profile(profile, context) }.compact
+ else
+ profile = context.driver.hardware_profile(context.credentials, id)
+ from_hardware_profile(profile, context)
+ end
+ end
+
+ private
+
+ def self.from_hardware_profile(profile, context)
+ # We accept just profiles with all properties set
+ return unless profile.memory or profile.cpu or profile.storage
+ memory = profile.memory.value || profile.memory.default
+ cpu = profile.cpu.value || profile.cpu.default
+ storage = profile.storage.value || profile.storage.default
+ machine_hash = {
+ :name => profile.name,
+ :description => "Machine Configuration with #{memory} #{profile.memory.unit} "+
+ "of memory and #{cpu} CPU",
+ :cpu => cpu,
+ :created => Time.now.to_s, # FIXME: DC hardware_profile has no mention about created_at
+ :memory => { :quantity => profile.memory.value || profile.memory.default, :units => profile.memory.unit },
+ :disks => [ { :capacity => { :quantity => profile.storage.value || profile.storage.default, :units => profile.storage.unit } } ],
+ :id => context.machine_configuration_url(profile.name)
+ }
+ self.new(machine_hash)
+ end
+
+end
diff --git a/server/lib/cimi/models/machine_configuration_collection.rb b/server/lib/cimi/models/machine_configuration_collection.rb
new file mode 100644
index 0000000..6d7ebad
--- /dev/null
+++ b/server/lib/cimi/models/machine_configuration_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::MachineConfigurationCollection < CIMI::Model::Base
+
+ act_as_root_entity :machine_configuration
+
+ array :machine_configurations do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.machine_configurations_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} MachineConfigurationCollection",
+ :machine_configurations => CIMI::Model::MachineConfiguration.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/machine_image.rb b/server/lib/cimi/models/machine_image.rb
new file mode 100644
index 0000000..7389475
--- /dev/null
+++ b/server/lib/cimi/models/machine_image.rb
@@ -0,0 +1,46 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::MachineImage < CIMI::Model::Base
+
+ href :image_location
+ text :image_data
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ images = []
+ if id == :all
+ images = context.driver.images(context.credentials)
+ images.map { |image| from_image(image, context) }
+ else
+ image = context.driver.image(context.credentials, :id => id)
+ from_image(image, context)
+ end
+ end
+
+ def self.from_image(image, context)
+ self.new(
+ :name => image.id,
+ :id => context.machine_image_url(image.id),
+ :description => image.description,
+ :created => Time.now.to_s,
+ :image_location => { :href => "#{context.driver.name}://#{image.id}" } # FIXME
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/machine_image_collection.rb b/server/lib/cimi/models/machine_image_collection.rb
new file mode 100644
index 0000000..70bdc7b
--- /dev/null
+++ b/server/lib/cimi/models/machine_image_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::MachineImageCollection < CIMI::Model::Base
+
+ act_as_root_entity :machine_image
+
+ array :machine_images do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.machine_images_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} MachineImageCollection",
+ :machine_images => CIMI::Model::MachineImage.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/machine_template.rb b/server/lib/cimi/models/machine_template.rb
new file mode 100644
index 0000000..8a88052
--- /dev/null
+++ b/server/lib/cimi/models/machine_template.rb
@@ -0,0 +1,41 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::MachineTemplate < CIMI::Model::Base
+
+ href :machine_config
+ href :machine_image
+ href :machine_admin
+
+ array :volumes do
+ scalar :href
+ scalar :protocol
+ scalar :attachment_point
+ end
+
+ array :volume_templates do
+ scalar :href, :attachment_point, :protocol
+ end
+
+ array :network_interfaces do
+ href :vsp
+ text :hostname, :mac_address, :state, :protocol, :allocation
+ text :address, :default_gateway, :dns, :max_transmission_unit
+ end
+
+ array :operations do
+ scalar :rel, :href
+ end
+end
diff --git a/server/lib/cimi/models/machine_template_collection.rb b/server/lib/cimi/models/machine_template_collection.rb
new file mode 100644
index 0000000..d2a3f23
--- /dev/null
+++ b/server/lib/cimi/models/machine_template_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::MachineTemplateCollection < CIMI::Model::Base
+
+ act_as_root_entity :machine_template
+
+ array :machine_templates do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.machine_template_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} MachineTemplateCollection",
+ :machine_templates => CIMI::Model::MachineTemplate.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/network.rb b/server/lib/cimi/models/network.rb
new file mode 100644
index 0000000..3d9c7ed
--- /dev/null
+++ b/server/lib/cimi/models/network.rb
@@ -0,0 +1,109 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::Network < CIMI::Model::Base
+
+ text :state
+
+ text :access
+
+ text :bandwidth_limit
+
+ text :traffic_priority
+
+ text :max_traffic_delay
+
+ text :max_traffic_loss
+
+ text :max_traffic_jitter
+
+ href :routing_group
+
+ href :event_log
+
+ array :meters do
+ scalar :href
+ end
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ networks=[]
+ if id==:all
+ networks = context.driver.networks(context.credentials, {:env=>context})
+ else
+ networks = context.driver.networks(context.credentials, {:id=>id, :env=>context})
+ end
+ networks
+ end
+
+ def self.create(request_body, context, type)
+ input = (type == :xml)? XmlSimple.xml_in(request_body, {"ForceArray"=>false,"NormaliseSpace"=>2}) : JSON.parse(request_body)
+ if input["networkTemplate"]["href"] #template by reference
+ network_config, routing_group = get_by_reference(input, context)
+ else
+ if input["networkTemplate"]["networkConfig"]["href"] # configuration by reference
+ network_config = CIMI::Model::NetworkConfiguration.find(context.href_id(input["networkTemplate"]["networkConfig"]["href"],
+ :network_configurations), context)
+ else #configuration by value
+ network_config = get_by_value(request_body, type)
+ end
+ routing_group = CIMI::Model::RoutingGroup.find(context.href_id(input["networkTemplate"]["routingGroup"]["href"],
+ :routing_groups), context)
+ end
+ params = {:network_config => network_config, :routing_group => routing_group, :name=>input["name"],
+ :description=>input["description"], :env=>context}
+ raise CIMI::Model::BadRequest.new("Bad request - missing required parameters. Client sent: #{request_body} which produced #{params.inspect}") if params.has_value?(nil)
+ context.driver.create_network(context.credentials, params)
+ end
+
+ def self.delete!(id, context)
+ context.driver.delete_network(context.credentials, id)
+ end
+
+ def perform(action, context, &block)
+ begin
+ if context.driver.send(:"#{action.name}_network", context.credentials, self.name)
+ block.callback :success
+ else
+ raise "Operation #{action.name} failed to execute on the Network #{self.name} "
+ end
+ rescue => e
+ block.callback :failure, e.message
+ end
+ end
+
+ private
+
+ def self.get_by_reference(input, context)
+ network_template = CIMI::Model::NetworkTemplate.find(context.href_id(input["networkTemplate"]["href"], :network_templates), context)
+ network_config = CIMI::Model::NetworkConfiguration.find(context.href_id(network_template.network_config.href, :network_configurations), context)
+ routing_group = CIMI::Model::RoutingGroup.find(context.href_id(network_template.routing_group.href, :routing_groups), context)
+ return network_config, routing_group
+ end
+
+ def self.get_by_value(request_body, type)
+ if type == :xml
+ xml_arrays = XmlSimple.xml_in(request_body, {"NormaliseSpace"=>2})
+ network_config = CIMI::Model::NetworkConfiguration.from_xml(XmlSimple.xml_out(xml_arrays["networkTemplate"][0]["networkConfig"][0]))
+ else
+ json = JSON.parse(request_body)
+ network_config = CIMI::Model::NetworkConfiguration.from_json(JSON.generate(json["networkTemplate"]["networkConfig"]))
+ end
+ end
+
+end
diff --git a/server/lib/cimi/models/network_collection.rb b/server/lib/cimi/models/network_collection.rb
new file mode 100644
index 0000000..d76a3dd
--- /dev/null
+++ b/server/lib/cimi/models/network_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::NetworkCollection < CIMI::Model::Base
+
+ act_as_root_entity :network
+
+ array :networks do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.networks_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} NetworkCollection",
+ :networks => CIMI::Model::Network.all(context).map { |c| { :href => c.id } }
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/network_configuration.rb b/server/lib/cimi/models/network_configuration.rb
new file mode 100644
index 0000000..1b04548
--- /dev/null
+++ b/server/lib/cimi/models/network_configuration.rb
@@ -0,0 +1,49 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::NetworkConfiguration < CIMI::Model::Base
+
+ text :access
+
+ text :bandwidth_limit
+
+ text :traffic_priority
+
+ text :max_traffic_delay
+
+ text :max_traffic_loss
+
+ text :max_traffic_jitter
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ network_configs = []
+ if id==:all
+ network_configs = context.driver.network_configurations(context.credentials, {:env=>context})
+ else
+ network_configs = context.driver.network_configurations(context.credentials, {:env=>context, :id=>id})
+ end
+ network_configs
+ end
+
+ def self.create_from_xml(request_body, context)
+ end
+
+ def self.create_from_json(request_body, context)
+ end
+end
diff --git a/server/lib/cimi/models/network_configuration_collection.rb b/server/lib/cimi/models/network_configuration_collection.rb
new file mode 100644
index 0000000..fc14592
--- /dev/null
+++ b/server/lib/cimi/models/network_configuration_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::NetworkConfigurationCollection < CIMI::Model::Base
+
+ act_as_root_entity :network_configuration
+
+ array :network_configurations do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.network_configurations_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} NetworkConfigurationCollection",
+ :network_configurations => CIMI::Model::NetworkConfiguration.all(context).map { |c| { :href => c.id } }
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/network_template.rb b/server/lib/cimi/models/network_template.rb
new file mode 100644
index 0000000..ce3b990
--- /dev/null
+++ b/server/lib/cimi/models/network_template.rb
@@ -0,0 +1,36 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::NetworkTemplate < CIMI::Model::Base
+
+ href :network_config
+
+ href :routing_group
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ network_templates = []
+ if id==:all
+ network_templates = context.driver.network_templates(context.credentials, {:env=>context})
+ else
+ network_templates = context.driver.network_templates(context.credentials, {:env=>context, :id=>id})
+ end
+ network_templates
+ end
+
+end
diff --git a/server/lib/cimi/models/network_template_collection.rb b/server/lib/cimi/models/network_template_collection.rb
new file mode 100644
index 0000000..b2ac537
--- /dev/null
+++ b/server/lib/cimi/models/network_template_collection.rb
@@ -0,0 +1,35 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+
+class CIMI::Model::NetworkTemplateCollection < CIMI::Model::Base
+
+ act_as_root_entity :network_template
+
+ array :network_templates do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.network_templates_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} NetworkTemplateCollection",
+ :network_templates => CIMI::Model::NetworkTemplate.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/routing_group.rb b/server/lib/cimi/models/routing_group.rb
new file mode 100644
index 0000000..d26f4d7
--- /dev/null
+++ b/server/lib/cimi/models/routing_group.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::RoutingGroup < CIMI::Model::Base
+
+ array :networks do
+ scalar :href
+ end
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ if id==:all
+ context.driver.routing_groups(context.credentials, {:env=>context})
+ else
+ context.driver.routing_groups(context.credentials, {:env=>context, :id=>id})
+ end
+ end
+
+end
diff --git a/server/lib/cimi/models/routing_group_collection.rb b/server/lib/cimi/models/routing_group_collection.rb
new file mode 100644
index 0000000..285e164
--- /dev/null
+++ b/server/lib/cimi/models/routing_group_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::RoutingGroupCollection < CIMI::Model::Base
+
+ act_as_root_entity :routing_group
+
+ array :routing_groups do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.routing_groups_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} RoutingGroupCollection",
+ :routing_groups => CIMI::Model::RoutingGroup.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/routing_group_template.rb b/server/lib/cimi/models/routing_group_template.rb
new file mode 100644
index 0000000..204a353
--- /dev/null
+++ b/server/lib/cimi/models/routing_group_template.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::RoutingGroupTemplate < CIMI::Model::Base
+
+ array :networks do
+ scalar :href
+ end
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ if id==:all
+ context.driver.routing_group_templates(context.credentials, {:env=>context})
+ else
+ context.driver.routing_group_templates(context.credentials, {:env=>context, :id=>id})
+ end
+ end
+
+end
diff --git a/server/lib/cimi/models/routing_group_template_collection.rb b/server/lib/cimi/models/routing_group_template_collection.rb
new file mode 100644
index 0000000..61a4a68
--- /dev/null
+++ b/server/lib/cimi/models/routing_group_template_collection.rb
@@ -0,0 +1,35 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+
+class CIMI::Model::RoutingGroupTemplateCollection < CIMI::Model::Base
+
+ act_as_root_entity :routing_group_template
+
+ array :routing_group_templates do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.routing_group_templates_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} RoutingGroupTemplateCollection",
+ :routing_group_templates => CIMI::Model::RoutingGroupTemplate.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/schema.rb b/server/lib/cimi/models/schema.rb
new file mode 100644
index 0000000..f301b69
--- /dev/null
+++ b/server/lib/cimi/models/schema.rb
@@ -0,0 +1,277 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+# The smarts of converting from XML and JSON into internal objects
+class CIMI::Model::Schema
+
+ #
+ # Attributes describe how we extract values from XML/JSON
+ #
+ class Attribute
+ attr_reader :name, :xml_name, :json_name
+
+ def initialize(name, opts = {})
+ @name = name
+ @xml_name = (opts[:xml_name] || name).to_s.camelize(true)
+ @json_name = (opts[:json_name] || name).to_s.camelize(true)
+ end
+
+ def from_xml(xml, model)
+ model[@name] = xml[@xml_name].first if xml.has_key?(@xml_name)
+ end
+
+ def from_json(json, model)
+ model[@name] = json[@json_name]
+ end
+
+ def to_xml(model, xml)
+ xml[@xml_name] = [model[@name]] if model[@name]
+ end
+
+ def to_json(model, json)
+ json[@json_name] = model[@name] if model and model[@name]
+ end
+ end
+
+ class Scalar < Attribute
+ def initialize(name, opts)
+ @text = opts[:text]
+ if ! [nil, :nested, :direct].include?(@text)
+ raise "text option for scalar must be :nested or :direct"
+ end
+ super(name, opts)
+ end
+
+ def text?; @text; end
+
+ def nested_text?; @text == :nested; end
+
+ def from_xml(xml, model)
+ case @text
+ when :nested then model[@name] = xml[@xml_name].first["content"] if xml[@xml_name]
+ when :direct then model[@name] = xml["content"]
+ else model[@name] = xml[@xml_name]
+ end
+ end
+
+ def to_xml(model, xml)
+ return unless model
+ return unless model[@name]
+ case @text
+ when :nested then xml[@xml_name] = [{ "content" => model[@name] }]
+ when :direct then xml["content"] = model[@name]
+ else xml[@xml_name] = model[@name]
+ end
+ end
+ end
+
+ class Struct < Attribute
+ def initialize(name, opts, &block)
+ content = opts[:content]
+ super(name, opts)
+ @schema = CIMI::Model::Schema.new
+ @schema.instance_eval(&block) if block_given?
+ @schema.scalar(content, :text => :direct) if content
+ end
+
+ def from_xml(xml, model)
+ xml = xml.has_key?(xml_name) ? xml[xml_name].first : {}
+ model[name] = convert_from_xml(xml)
+ end
+
+ def from_json(json, model)
+ json = json.has_key?(json_name) ? json[json_name] : {}
+ model[name] = convert_from_json(json)
+ end
+
+ def to_xml(model, xml)
+ conv = convert_to_xml(model[name])
+ xml[xml_name] = [conv] unless conv.empty?
+ end
+
+ def to_json(model, json)
+ conv = convert_to_json(model[name])
+ json[json_name] = conv unless conv.empty?
+ end
+
+ def convert_from_xml(xml)
+ sub = struct.new
+ @schema.from_xml(xml, sub)
+ sub
+ end
+
+ def convert_from_json(json)
+ sub = struct.new
+ @schema.from_json(json, sub)
+ sub
+ end
+
+ def convert_to_xml(model)
+ xml = {}
+ @schema.to_xml(model, xml)
+ xml
+ end
+
+ def convert_to_json(model)
+ json = {}
+ @schema.to_json(model, json)
+ json
+ end
+
+ private
+ def struct
+ cname = "CIMI_#{json_name.upcase_first}"
+ if ::Struct.const_defined?(cname)
+ ::Struct.const_get(cname)
+ else
+ ::Struct.new("CIMI_#{json_name.upcase_first}",
+ *@schema.attribute_names)
+ end
+ end
+ end
+
+ class Array < Attribute
+ # For an array :things, we collect all <thing/> elements (XmlSimple
+ # actually does the collecting)
+ def initialize(name, opts = {}, &block)
+ opts[:xml_name] = name.to_s.singularize unless opts[:xml_name]
+ super(name, opts)
+ @struct = Struct.new(name, opts, &block)
+ end
+
+ def from_xml(xml, model)
+ model[name] = (xml[xml_name] || []).map { |elt| @struct.convert_from_xml(elt) }
+ end
+
+ def from_json(json, model)
+ model[name] = (json[json_name] || []).map { |elt| @struct.convert_from_json(elt) }
+ end
+
+ def to_xml(model, xml)
+ ary = (model[name] || []).map { |elt| @struct.convert_to_xml(elt) }
+ xml[xml_name] = ary unless ary.empty?
+ end
+
+ def to_json(model, json)
+ ary = (model[name] || []).map { |elt| @struct.convert_to_json(elt) }
+ json[json_name] = ary unless ary.empty?
+ end
+ end
+
+ class Hash < Attribute
+
+ def initialize(name, opts = {}, &block)
+ opts[:json_name] = name.to_s.pluralize unless opts[:json_name]
+ super(name, opts)
+ @struct = Struct.new(name, opts, &block)
+ end
+
+ def from_xml(xml, model)
+ model[name] = (xml[xml_name] || []).map { |elt| @struct.convert_from_xml(elt) }
+ end
+
+ def from_json(json, model)
+ model[name] = (json[json_name] || {}).inject([]) do |result,item|
+ result << @struct.convert_from_json({ 'name' => item[0], 'value' => item[1] })
+ end
+ end
+
+ def to_xml(model, xml)
+ ary = (model[name] || []).map { |elt| @struct.convert_to_xml(elt) }
+ xml[xml_name] = ary unless ary.empty?
+ end
+
+ def to_json(model, json)
+ ary = (model[name] || []).map { |elt| @struct.convert_to_json(elt) }
+ json[json_name] = ary.inject({}) { |result, item| result[item['name']] = item['value']; result } unless ary.empty?
+ end
+ end
+
+ #
+ # The actual Schema class
+ #
+ def initialize
+ @attributes = []
+ end
+
+ def from_xml(xml, model = {})
+ @attributes.freeze
+ @attributes.each { |attr| attr.from_xml(xml, model) }
+ model
+ end
+
+ def from_json(json, model = {})
+ @attributes.freeze
+ @attributes.each { |attr| attr.from_json(json, model) }
+ model
+ end
+
+ def to_xml(model, xml = {})
+ @attributes.freeze
+ @attributes.each { |attr| attr.to_xml(model, xml) }
+ xml
+ end
+
+ def to_json(model, json = {})
+ @attributes.freeze
+ @attributes.each { |attr| attr.to_json(model, json) }
+ json
+ end
+
+ def attribute_names
+ @attributes.map { |a| a.name }
+ end
+
+ #
+ # The DSL
+ #
+ # Requires that the class into which this is included has a
+ # +add_attributes!+ method
+ module DSL
+ def href(*args)
+ args.each { |arg| struct(arg) { scalar :href } }
+ end
+
+ def text(*args)
+ args.expand_opts!(:text => :nested)
+ scalar(*args)
+ end
+
+ def scalar(*args)
+ add_attributes!(args, Scalar)
+ end
+
+ def array(name, opts={}, &block)
+ add_attributes!([name, opts], Array, &block)
+ end
+
+ def struct(name, opts={}, &block)
+ add_attributes!([name, opts], Struct, &block)
+ end
+
+ def hash(name, opts={}, &block)
+ add_attributes!([name, opts], Hash, &block)
+ end
+ end
+
+ include DSL
+
+ def add_attributes!(args, attr_klass, &block)
+ raise "The schema has already been used to convert objects" if @attributes.frozen?
+ opts = args.extract_opts!
+ args.each { |arg| @attributes << attr_klass.new(arg, opts, &block) }
+ end
+end
diff --git a/server/lib/cimi/models/volume.rb b/server/lib/cimi/models/volume.rb
new file mode 100644
index 0000000..9c106e2
--- /dev/null
+++ b/server/lib/cimi/models/volume.rb
@@ -0,0 +1,103 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::Volume < CIMI::Model::Base
+
+ struct :capacity do
+ scalar :quantity
+ scalar :units
+ end
+ text :bootable
+ text :supports_snapshots
+ array :snapshots do
+ scalar :ref
+ end
+ text :guest_interface
+ array :meters do
+ scalar :ref
+ end
+ href :eventlog
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ volumes = []
+ opts = ( id == :all ) ? {} : { :id => id }
+ volumes = context.driver.storage_volumes(context.credentials, opts)
+ volumes.collect!{ |volume| from_storage_volume(volume, context) }
+ return volumes.first unless volumes.length > 1
+ return volumes
+ end
+
+ def self.all(context); find(:all, context); end
+
+ def self.create_from_json(json_in, context)
+ json = JSON.parse(json_in)
+ volume_config_id = json["volumeTemplate"]["volumeConfig"]["href"].split("/").last
+ volume_image_id = (json["volumeTemplate"].has_key?("volumeImage") ?
+ json["volumeTemplate"]["volumeImage"]["href"].split("/").last : nil)
+ create_volume({:volume_config_id=>volume_config_id, :volume_image_id=>volume_image_id}, context)
+ end
+
+ def self.create_from_xml(xml_in, context)
+ xml = XmlSimple.xml_in(xml_in)
+ volume_config_id = xml["volumeTemplate"][0]["volumeConfig"][0]["href"].split("/").last
+ volume_image_id = (xml["volumeTemplate"][0].has_key?("volumeImage") ?
+ xml["volumeTemplate"][0]["volumeImage"][0]["href"].split("/").last : nil)
+ create_volume({:volume_config_id=>volume_config_id, :volume_image_id=>volume_image_id}, context)
+ end
+
+ def self.delete!(id, context)
+ context.driver.destroy_storage_volume(context.credentials, {:id=>id} )
+ end
+
+ def self.find_to_attach_from_json(json_in, context)
+ json = JSON.parse(json_in)
+ volumes = json["volumes"].map{|v| {:volume=>self.find(v["volume"]["href"].split("/volumes/").last, context),
+ :attachment_point=>v["attachmentPoint"] }}
+ end
+
+ def self.find_to_attach_from_xml(xml_in, context)
+ xml = XmlSimple.xml_in(xml_in)
+ volumes = xml["volume"].map{|v| {:volume => self.find(v["href"].split("/volumes/").last, context),
+ :attachment_point=>v["attachmentPoint"] }}
+ end
+
+ private
+
+ def self.create_volume(params, context)
+ volume_config = CIMI::Model::VolumeConfiguration.find(params[:volume_config_id], context)
+ opts = {:capacity=>volume_config.capacity[:quantity], :snapshot_id=>params[:volume_image_id] }
+ storage_volume = self.driver.create_storage_volume(context.credentials, opts)
+ from_storage_volume(storage_volume, context)
+ end
+
+ def self.from_storage_volume(volume, context)
+ self.new( { :name => volume.id,
+ :description => volume.id,
+ :created => volume.created,
+ :id => context.volume_url(volume.id),
+ :capacity => { :quantity=>volume.capacity, :units=>"gibibyte" }, #FIXME... units will vary
+ :bootable => "false", #fixme ... will vary... ec2 doesn't expose this
+ :supports_snapshots => "true", #fixme, will vary (true for ec2)
+ :snapshots => [], #fixme...
+ :guest_interface => "",
+ :eventlog => {:href=> "http://eventlogs"},#FIXME
+ :meters => []
+ } )
+ end
+
+end
diff --git a/server/lib/cimi/models/volume_collection.rb b/server/lib/cimi/models/volume_collection.rb
new file mode 100644
index 0000000..1f4152e
--- /dev/null
+++ b/server/lib/cimi/models/volume_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VolumeCollection < CIMI::Model::Base
+
+ act_as_root_entity :volume
+
+ array :volumes do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.volumes_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} VolumeCollection",
+ :volumes => CIMI::Model::Volume.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/volume_configuration.rb b/server/lib/cimi/models/volume_configuration.rb
new file mode 100644
index 0000000..75b37ea
--- /dev/null
+++ b/server/lib/cimi/models/volume_configuration.rb
@@ -0,0 +1,60 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VolumeConfiguration < CIMI::Model::Base
+
+ text :format
+ struct :capacity do
+ scalar :quantity
+ scalar :units
+ end
+ text :supports_snapshots
+ text :guest_interface
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ volume_configs = []
+ if id == :all
+ #ec2 ebs volumes can 1gb..1tb
+ (1..1000).each do |size|
+ volume_configs << create(size, context)
+ end
+ else
+ volume_configs << create(id, context)
+ return volume_configs.first
+ end
+ return volume_configs
+ end
+
+
+ def self.all(context); find(:all, context); end
+
+ private
+
+ def self.create(size, context)
+ self.new( {
+ :id => context.volume_configuration_url(size),
+ :name => size,
+ :description => "volume configuration with #{size} GiB",
+ :created => Time.now.to_s,
+ :capacity => {:quantity=>size, :units=>"gibibytes"},
+ :supports_snapshots => "true"
+ # FIXME :guest_interface => "NFS"
+ } )
+ end
+
+end
diff --git a/server/lib/cimi/models/volume_configuration_collection.rb b/server/lib/cimi/models/volume_configuration_collection.rb
new file mode 100644
index 0000000..2120ae6
--- /dev/null
+++ b/server/lib/cimi/models/volume_configuration_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VolumeConfigurationCollection < CIMI::Model::Base
+
+ act_as_root_entity :volume_configuration
+
+ array :volume_configurations do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.volume_configurations_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} VolumeConfigurationCollection",
+ :volume_configurations => CIMI::Model::VolumeConfiguration.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/volume_image.rb b/server/lib/cimi/models/volume_image.rb
new file mode 100644
index 0000000..03cc7fd
--- /dev/null
+++ b/server/lib/cimi/models/volume_image.rb
@@ -0,0 +1,49 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VolumeImage < CIMI::Model::Base
+
+ href :image_location
+ text :image_data
+ text :bootable
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ storage_snapshots = []
+ opts = ( id==:all ) ? {} : { :id=>id }
+ storage_snapshots = self.driver.storage_snapshots(context.credentials, opts)
+ storage_snapshots.collect!{ |snapshot| from_storage_snapshot(snapshot, context) }
+ return storage_snapshots.first unless storage_snapshots.length > 1
+ return storage_snapshots
+ end
+
+ def self.all(context); find(:all, context); end
+
+ private
+
+ def self.from_storage_snapshot(snapshot, context)
+ self.new( {
+ :name => snapshot.id,
+ :description => snapshot.id,
+ :created => snapshot.created,
+ :id => context.volume_image_url(snapshot.id),
+ :image_location => {:href=>context.volume_url(snapshot.storage_volume_id)},
+ :bootable => "false" #FIXME
+ } )
+ end
+
+end
diff --git a/server/lib/cimi/models/volume_image_collection.rb b/server/lib/cimi/models/volume_image_collection.rb
new file mode 100644
index 0000000..f3da877
--- /dev/null
+++ b/server/lib/cimi/models/volume_image_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VolumeImageCollection < CIMI::Model::Base
+
+ act_as_root_entity :volume_image
+
+ array :volume_images do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.volume_images_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} VolumeImageCollection",
+ :volume_images => CIMI::Model::VolumeImage.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/volume_template.rb b/server/lib/cimi/models/volume_template.rb
new file mode 100644
index 0000000..b9c82db
--- /dev/null
+++ b/server/lib/cimi/models/volume_template.rb
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VolumeTemplate < CIMI::Model::Base
+
+ href :volume_config
+ href :volume_image
+ array :operations do
+ scalar :rel, :href
+ end
+end
diff --git a/server/lib/cimi/models/volume_template_collection.rb b/server/lib/cimi/models/volume_template_collection.rb
new file mode 100644
index 0000000..f53547c
--- /dev/null
+++ b/server/lib/cimi/models/volume_template_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VolumeTemplateCollection < CIMI::Model::Base
+
+ act_as_root_entity :volume_template
+
+ array :volume_templates do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.volume_template_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} VolumeTemplateCollection",
+ :volume_templates => CIMI::Model::VolumeTemplate.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/vsp.rb b/server/lib/cimi/models/vsp.rb
new file mode 100644
index 0000000..b8b27f5
--- /dev/null
+++ b/server/lib/cimi/models/vsp.rb
@@ -0,0 +1,102 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VSP < CIMI::Model::Base
+
+ text :state
+
+ href :network
+
+ text :bandwidth_reservation
+
+ text :traffic_priority
+
+ text :max_traffic_delay
+
+ text :max_traffic_loss
+
+ text :max_traffic_jitter
+
+ href :event_log
+
+ array :meters do
+ scalar :href
+ end
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ if id==:all
+ context.driver.vsps(context.credentials, {:env=>context})
+ else
+ context.driver.vsps(context.credentials, {:id=>id, :env=>context})
+ end
+ end
+
+ def self.create(request_body, context, type)
+ input = (type == :xml)? XmlSimple.xml_in(request_body, {"ForceArray"=>false, "NormaliseSpace"=>2}) : JSON.parse(request_body)
+ if input["vspTemplate"]["href"] #template by reference
+ vsp_config, network = get_by_reference(input, context)
+ else
+ if input["vspTemplate"]["vspConfig"]["href"] # configuration by reference
+ vsp_config = CIMI::Model::VSPConfiguration.find(context.href_id(input["vspTemplate"]["vspConfig"]["href"],:vsp_configurations), context)
+ else #configuration by value
+ vsp_config = get_by_value(request_body, type)
+ end
+ network = CIMI::Model::Network.find(context.href_id(input["vspTemplate"]["network"]["href"], :networks), context)
+ end
+ params = {:vsp_config => vsp_config, :network => network, :name=>input["name"], :description=>input["description"], :env=>context}
+ raise CIMI::Model::BadRequest.new("Bad request - missing required parameters. Client sent: #{request_body} which produced #{params.inspect}") if params.has_value?(nil)
+ context.driver.create_vsp(context.credentials, params)
+ end
+
+ def self.delete!(id, context)
+ context.driver.delete_vsp(context.credentials, id)
+ end
+
+ def perform(action, context, &block)
+ begin
+ if context.driver.send(:"#{action.name}_vsp", context.credentials, self.name)
+ block.callback :success
+ else
+ raise "Operation #{action.name} failed to execute on the VSP #{self.name} "
+ end
+ rescue => e
+ block.callback :failure, e.message
+ end
+ end
+
+
+ private
+
+ def self.get_by_reference(input, context)
+ vsp_template = CIMI::Model::VSPTemplate.find(context.href_id(input["vspTemplate"]["href"], :vsp_templates), context)
+ vsp_config = CIMI::Model::VSPConfiguration.find(context.href_id(vsp_template.vsp_config.href, :vsp_configurations), context)
+ network = CIMI::Model::Network.find(context.href_id(vsp_template.network.href, :networks), context)
+ return vsp_config, network
+ end
+
+ def self.get_by_value(request_body, type)
+ if type == :xml
+ xml_arrays = XmlSimple.xml_in(request_body, {"NormaliseSpace"=>2})
+ vsp_config = CIMI::Model::VSPConfiguration.from_xml(XmlSimple.xml_out(xml_arrays["vspTemplate"][0]["vspConfig"][0]))
+ else
+ json = JSON.parse(request_body)
+ vsp_config = CIMI::Model::VSPConfiguration.from_json(JSON.generate(json["vspTemplate"]["vspConfig"]))
+ end
+ end
+end
diff --git a/server/lib/cimi/models/vsp_collection.rb b/server/lib/cimi/models/vsp_collection.rb
new file mode 100644
index 0000000..fc72024
--- /dev/null
+++ b/server/lib/cimi/models/vsp_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VSPCollection < CIMI::Model::Base
+
+ CIMI::Model.register_as_root_entity! "VSPs"
+
+ array :vsps do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.vsps_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} VSPCollection",
+ :vsps => CIMI::Model::VSP.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/vsp_configuration.rb b/server/lib/cimi/models/vsp_configuration.rb
new file mode 100644
index 0000000..c9a9bf3
--- /dev/null
+++ b/server/lib/cimi/models/vsp_configuration.rb
@@ -0,0 +1,40 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VSPConfiguration < CIMI::Model::Base
+
+ text :bandwidth_reservation
+
+ text :traffic_priority
+
+ text :max_traffic_delay
+
+ text :max_traffic_loss
+
+ text :max_traffic_jitter
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ if id==:all
+ context.driver.vsp_configurations(context.credentials, {:env=>context})
+ else
+ context.driver.vsp_configurations(context.credentials, {:env=>context, :id=>id})
+ end
+ end
+
+end
diff --git a/server/lib/cimi/models/vsp_configuration_collection.rb b/server/lib/cimi/models/vsp_configuration_collection.rb
new file mode 100644
index 0000000..d4927e7
--- /dev/null
+++ b/server/lib/cimi/models/vsp_configuration_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VSPConfigurationCollection < CIMI::Model::Base
+
+ CIMI::Model.register_as_root_entity! "VSPConfigurations"
+
+ array :vsp_configurations do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.vsp_configurations_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} VSPConfigurationCollection",
+ :vsp_configurations => CIMI::Model::VSPConfiguration.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/models/vsp_template.rb b/server/lib/cimi/models/vsp_template.rb
new file mode 100644
index 0000000..f1b8078
--- /dev/null
+++ b/server/lib/cimi/models/vsp_template.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VSPTemplate < CIMI::Model::Base
+
+ href :network
+
+ href :vsp_config
+
+ array :operations do
+ scalar :rel, :href
+ end
+
+ def self.find(id, context)
+ if id==:all
+ context.driver.vsp_templates(context.credentials, {:env=>context})
+ else
+ context.driver.vsp_templates(context.credentials, {:env=>context, :id=>id})
+ end
+ end
+
+end
diff --git a/server/lib/cimi/models/vsp_template_collection.rb b/server/lib/cimi/models/vsp_template_collection.rb
new file mode 100644
index 0000000..61d5311
--- /dev/null
+++ b/server/lib/cimi/models/vsp_template_collection.rb
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+class CIMI::Model::VSPTemplateCollection < CIMI::Model::Base
+
+ CIMI::Model.register_as_root_entity! "VSPTemplates"
+
+ array :vsp_templates do
+ scalar :href
+ end
+
+ def self.default(context)
+ self.new(
+ :id => context.vsp_templates_url,
+ :name => 'default',
+ :created => Time.now,
+ :description => "#{context.driver.name.capitalize} VSPTemplateCollection",
+ :vsp_templates => CIMI::Model::VSPTemplate.all_uri(context)
+ )
+ end
+
+end
diff --git a/server/lib/cimi/server.rb b/server/lib/cimi/server.rb
index 60f9a3b..a1c7ef9 100644
--- a/server/lib/cimi/server.rb
+++ b/server/lib/cimi/server.rb
@@ -13,947 +13,48 @@
# License for the specific language governing permissions and limitations
# under the License.
-require 'cimi/dependencies'
-require 'cimi/helpers/cimi_helper'
-require 'cimi/model'
+require 'rubygems'
+require 'crack'
+require 'json'
+require 'yaml'
+require 'haml'
+require 'sinatra/base'
+require 'sinatra/rabbit'
+require_relative '../sinatra'
-set :version, '0.1.0'
+require_relative './helpers'
+require_relative './collections'
-include Deltacloud::Drivers
-include CIMI::Model
+CMWG_NAMESPACE = "http://www.dmtf.org/cimi"
-set :drivers, Proc.new { driver_config }
+module CIMI
+ class API < Collections::Base
-Sinatra::Application.register Rack::RespondTo
+ # Enable logging
+ use Rack::CommonLogger
+ use Rack::Date
+ use Rack::ETag
+ use Rack::MatrixParams
+ use Rack::DriverSelect
+ use Rack::Accept
+ use Rack::MediaType
-use Rack::ETag
-use Rack::Runtime
-use Rack::MatrixParams
-use Rack::DriverSelect
-use Rack::MediaType
-use Rack::Date
-use Rack::CIMI
+ helpers CIMIHelper
-configure do
- set :root_url, "/cimi"
- set :views, File::join($top_srcdir, 'views', 'cimi')
- set :public_folder, File::join($top_srcdir, 'public')
- driver
-end
-
-configure :production do
- use Rack::SyslogLogger
- disable :logging
- enable :show_errors
- set :dump_errors, false
- $stdout = SyslogFile.new
- $stderr = $stdout
-end
-
-configure :development do
- set :raise_errors => false
- set :show_exceptions, false
- $stdout.sync = true
- $stderr.sync = true
-end
-
-# You could use $API_HOST environment variable to change your hostname to
-# whatever you want (eg. if you running API behind NAT)
-HOSTNAME=ENV['API_HOST'] ? ENV['API_HOST'] : nil
-
-error do
- report_error
-end
-
-get "/" do
- redirect settings.root_url
-end
-
-get "#{settings.root_url}\/?" do
- halt 401 if params[:force_auth] and not driver.valid_credentials?(credentials)
- redirect cloudEntryPoint_url, 301
-end
+ include Deltacloud::Helpers
+ include CIMI::Collections
+ include CIMI::Model
-global_collection :cloudEntryPoint do
- description 'Cloud entry point'
- operation :index do
- description "list all resources of the cloud"
- control do
- entry_point = CloudEntryPoint.create(self)
+ get API_ROOT_URL do
+ if params[:force_auth]
+ return [401, 'Authentication failed'] unless driver.valid_credentials?(credentials)
+ end
+ entry_point = CIMI::Model::CloudEntryPoint.create(self)
respond_to do |format|
format.xml { entry_point.to_xml }
format.json { entry_point.to_json }
end
end
- end
-end
-
-global_collection :machine_configurations do
- description 'List all machine configurations'
-
- operation :index do
- param :CIMISelect, :string, :optional
- description "List all machine configurations"
- control do
- machine_configs = MachineConfigurationCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml { machine_configs.to_xml }
- format.json { machine_configs.to_json }
- end
- end
- end
-
- operation :show do
-
- description "The Machine Configuration entity represents the set of configuration values "+
- "that define the (virtual) hardware resources of a to-be-realized Machine Instance.."
-
- param :id, :string, :required
-
- control do
- machine_conf = MachineConfiguration.find(params[:id], self)
- respond_to do |format|
- format.xml { machine_conf.to_xml }
- format.json { machine_conf.to_json }
- end
- end
-
- end
-end
-
-global_collection :machine_images do
- description 'List all machine images'
-
- operation :index do
- description "List all machine configurations"
- param :CIMISelect, :string, :optional
- control do
- machine_images = MachineImageCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml { machine_images.to_xml }
- format.json { machine_images.to_json }
- end
- end
- end
-
- operation :show do
- description "Show specific machine image."
- param :id, :string, :required
- control do
- machine_image = MachineImage.find(params[:id], self)
- respond_to do |format|
- format.xml { machine_image.to_xml }
- format.json { machine_image.to_json }
- end
- end
- end
-
-end
-
-global_collection :machine_admins do
- description 'Machine Admin entity'
-
- operation :index do
- description "List all machine admins"
- param :CIMISelect, :string, :optional
- with_capability :keys
- control do
- machine_admins = MachineAdminCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml { machine_admins.to_xml }
- format.json { machine_admins.to_json }
- end
- end
- end
-
- operation :show do
- description "Show specific machine admin"
- param :id, :string, :required
- with_capability :key
- control do
- machine_admin = MachineAdmin.find(params[:id], self)
- respond_to do |format|
- format.xml { machine_admin.to_xml }
- format.json { machine_admin.to_json }
- end
- end
- end
-
- operation :create do
- description "Show specific machine admin"
- with_capability :create_key
- control do
- if request.content_type.end_with?("+json")
- new_admin = MachineAdmin.create_from_json(request.body.read, self)
- else
- new_admin = MachineAdmin.create_from_xml(request.body.read, self)
- end
- status 201 # Created
- respond_to do |format|
- format.json { new_admin.to_json }
- format.xml { new_admin.to_xml }
- end
- end
- end
-
- operation :delete, :method => :delete, :member => true do
- description "Delete specified MachineAdmin entity"
- param :id, :string, :required
- control do
- MachineAdmin.delete!(params[:id], self)
- no_content_with_status(200)
- end
- end
-
-end
-
-global_collection :machines do
- description 'List all machine'
-
- operation :index do
- param :CIMISelect, :string, :optional
- description "List all machines"
- control do
- machines = MachineCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml { machines.to_xml }
- format.json { machines.to_json }
- end
- end
- end
-
- operation :show do
- description "Show specific machine."
- param :id, :string, :required
- control do
- machine = Machine.find(params[:id], self)
- respond_to do |format|
- format.xml { machine.to_xml }
- format.json { machine.to_json }
- end
- end
- end
- operation :create do
- description "Create a new Machine entity."
- control do
- if request.content_type.end_with?("+json")
- new_machine = Machine.create_from_json(request.body.read, self)
- else
- new_machine = Machine.create_from_xml(request.body.read, self)
- end
- status 201 # Created
- respond_to do |format|
- format.json { new_machine.to_json }
- format.xml { new_machine.to_xml }
- end
- end
end
-
- operation :destroy do
- description "Delete a specified machine."
- param :id, :string, :required
- control do
- Machine.delete!(params[:id], self)
- no_content_with_status(200)
- end
- end
-
- operation :stop, :method => :post, :member => true do
- description "Stop specific machine."
- param :id, :string, :required
- control do
- machine = Machine.find(params[:id], self)
- if request.content_type.end_with?("+json")
- action = Action.from_json(request.body.read)
- else
- action = Action.from_xml(request.body.read)
- end
- machine.perform(action, self) do |operation|
- no_content_with_status(202) if operation.success?
- # Handle errors using operation.failure?
- end
- end
- end
-
- operation :restart, :method => :post, :member => true do
- description "Start specific machine."
- param :id, :string, :required
- control do
- machine = Machine.find(params[:id], self)
- if request.content_type.end_with?("+json")
- action = Action.from_json(request.body.read)
- else
- action = Action.from_xml(request.body.read)
- end
- machine.perform(action, self) do |operation|
- no_content_with_status(202) if operation.success?
- # Handle errors using operation.failure?
- end
- end
- end
-
- operation :start, :method => :post, :member => true do
- description "Start specific machine."
- param :id, :string, :required
- control do
- machine = Machine.find(params[:id], self)
- if request.content_type.end_with?("+json")
- action = Action.from_json(request.body.read)
- else
- action = Action.from_xml(request.body.read)
- end
- machine.perform(action, self) do |operation|
- no_content_with_status(202) if operation.success?
- # Handle errors using operation.failure?
- end
- end
- end
-
-#NOTE: The routes for attach/detach used here are NOT as specified by CIMI
-#will likely move later. CIMI specifies PUT of the whole Machine description
-#with inclusion/ommission of the volumes you want [att|det]ached
- operation :attach_volume, :method => :put, :member => true do
- description "Attach CIMI Volume(s) to a machine."
- param :id, :string, :required
- control do
- if request.content_type.end_with?("+json")
- volumes_to_attach = Volume.find_to_attach_from_json(request.body.read, self)
- else
- volumes_to_attach = Volume.find_to_attach_from_xml(request.body.read, self)
- end
- machine = Machine.attach_volumes(volumes_to_attach, self)
- respond_to do |format|
- format.json{ machine.to_json}
- format.xml{machine.to_xml}
- end
- end
- end
-
- operation :detach_volume, :method => :put, :member => true do
- description "Detach CIMI Volume(s) from a machine."
- param :id, :string, :required
- control do
- if request.content_type.end_with?("+json")
- volumes_to_detach = Volume.find_to_attach_from_json(request.body.read, self)
- else
- volumes_to_detach = Volume.find_to_attach_from_xml(request.body.read, self)
- end
- machine = Machine.detach_volumes(volumes_to_detach, self)
- respond_to do |format|
- format.json{ machine.to_json}
- format.xml{machine.to_xml}
- end
- end
- end
-end
-
-global_collection :volumes do
- description "Volume represents storage at either the block or file-system level. Volumes can be attached to Machines. Once attached, Volumes can be accessed by processes on that Machine"
-
- operation :index do
- description "List all volumes"
- param :CIMISelect, :string, :optional
- control do
- volumes = VolumeCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml { volumes.to_xml }
- format.json { volumes.to_json }
- end
- end
- end
-
- operation :show do
- description "Show specific Volume."
- param :id, :string, :required
- control do
- volume = Volume.find(params[:id], self)
- if volume
- respond_to do |format|
- format.xml { volume.to_xml }
- format.json { volume.to_json }
- end
- else
- report_error(404)
- end
- end
- end
-
- operation :create do
- description "Create a new Volume."
- control do
- content_type = (request.content_type.end_with?("+json") ? :json : :xml)
- #((request.content_type.end_with?("+xml")) ? :xml : report_error(415) ) FIXME
- case content_type
- when :json
- new_volume = Volume.create_from_json(request.body.read, self)
- when :xml
- new_volume = Volume.create_from_xml(request.body.read, self)
- end
- respond_to do |format|
- format.json { new_volume.to_json }
- format.xml { new_volume.to_xml }
- end
- end
- end
-
- operation :destroy do
- description "Delete a specified Volume"
- param :id, :string, :required
- control do
- Volume.delete!(params[:id], self)
- no_content_with_status(200)
- end
- end
-
-end
-
-global_collection :volume_configurations do
- description "The Volume Configuration entity represents the set of configuration values needed to create a Volume with certain characteristics. Volume Configurations are created by Providers and MAY, at the Providers discretion, be created by Consumers"
-
- operation :index do
- description "Get list all VolumeConfigurations"
- param :CIMISelect, :string, :optional
- control do
- volume_configuration = VolumeConfigurationCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml { volume_configuration.to_xml }
- format.json { volume_configuration.to_json }
- end
- end
- end
-
- operation :show do
- description "Get a specific VolumeConfiguration"
- param :id, :required, :string
- control do
- volume_config = VolumeConfiguration.find(params[:id], self)
- respond_to do |format|
- format.xml { volume_config.to_xml }
- format.json { volume_config.json }
- end
- end
- end
-
-global_collection :volume_images do
- description 'This entity represents an image that could be place on a pre-loaded volume.'
-
- operation :index do
- description "List all volumes images"
- param :CIMISelect, :string, :optional
- control do
- volume_images = VolumeImageCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml { volume_images.to_xml }
- format.json { volume_images.to_json }
- end
- end
- end
-
- operation :show do
- description "Show a specific volume image"
- param :id, :string, :required
- control do
- volume_image = VolumeImage.find(params[:id], self)
- respond_to do |format|
- format.xml { volume_image.to_xml }
- format.json { volume_image.to_json }
- end
- end
- end
-
-end
-
-
-global_collection :entity_metadata do
- description 'This allows for the discovery of Provider defined constraints on the CIMI defined attributes as well as discovery of any new extension attributes that the Provider may have defined.'
-
- operation :index do
- description "List all entity metadata defined for this provider"
- control do
- entity_metadata = EntityMetadataCollection.default(self)
- respond_to do |format|
- format.xml{entity_metadata.to_xml}
- format.json{entity_metadata.to_json}
- end
- end
- end
-
- operation :show do
- description "Get the entity metadata for a specific collection"
- param :id, :required, :string
- control do
- entity_metadata = EntityMetadata.find(params[:id], self)
- respond_to do |format|
- format.xml{entity_metadata.to_xml}
- format.json{entity_metadata.to_json}
- end
- end
- end
-
-end
-
-global_collection :networks do
- description 'A Network represents an abstraction of a layer 2 broadcast domain'
-
- operation :index do
- description "List all Networks"
- param :CIMISelect, :string, :optional
- control do
- networks = NetworkCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml { networks.to_xml }
- format.json { networks.to_json }
- end
- end
- end
-
- operation :show do
- description "Show a specific Network"
- param :id, :string, :required
- control do
- network = Network.find(params[:id], self)
- respond_to do |format|
- format.xml { network.to_xml }
- format.json { network.to_json }
- end
- end
- end
-
- operation :create do
- description "Create a new Network"
- control do
- if request.content_type.end_with?("json")
- network = Network.create(request.body.read, self, :json)
- else
- network = Network.create(request.body.read, self, :xml)
- end
- respond_to do |format|
- format.xml { network.to_xml}
- format.json { network.to_json }
- end
- end
- end
-
- operation :destroy do
- description "Delete a specified Network"
- param :id, :string, :required
- control do
- Network.delete!(params[:id], self)
- no_content_with_status(200)
- end
- end
-
- operation :start, :method => :post, :member => true do
- description "Start specific network."
- param :id, :string, :required
- control do
- network = Network.find(params[:id], self)
- report_error(404) unless network
- if request.content_type.end_with?("json")
- action = Action.from_json(request.body.read)
- else
- action = Action.from_xml(request.body.read)
- end
- network.perform(action, self) do |operation|
- no_content_with_status(202) if operation.success?
- # Handle errors using operation.failure?
- end
- end
- end
-
- operation :stop, :method => :post, :member => true do
- description "Stop specific network."
- param :id, :string, :required
- control do
- network = Network.find(params[:id], self)
- report_error(404) unless network
- if request.content_type.end_with?("json")
- action = Action.from_json(request.body.read)
- else
- action = Action.from_xml(request.body.read)
- end
- network.perform(action, self) do |operation|
- no_content_with_status(202) if operation.success?
- # Handle errors using operation.failure?
- end
- end
- end
-
- operation :suspend, :method => :post, :member => true do
- description "Suspend specific network."
- param :id, :string, :required
- control do
- network = Network.find(params[:id], self)
- report_error(404) unless network
- if request.content_type.end_with?("json")
- action = Action.from_json(request.body.read)
- else
- action = Action.from_xml(request.body.read)
- end
- network.perform(action, self) do |operation|
- no_content_with_status(202) if operation.success?
- # Handle errors using operation.failure?
- end
- end
- end
-
-end
-
-global_collection :network_configurations do
- description 'Network Configurations contain the set of configuration values representing the information needed to create a Network with certain characteristics'
-
- operation :index do
- description 'List all NetworkConfigurations'
- param :CIMISelect, :string, :optional
- control do
- network_configurations = NetworkConfigurationCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml { network_configurations.to_xml }
- format.json { network_configurations.to_json }
- end
- end
- end
-
- operation :show do
- description 'Show a specific NetworkConfiguration'
- param :id, :string, :required
- control do
- network_config = NetworkConfiguration.find(params[:id], self)
- respond_to do |format|
- format.xml { network_config.to_xml }
- format.json { network_config.to_json }
- end
- end
- end
-end
-end
-
-global_collection :network_templates do
-
- description 'Network Template is a set of configuration values for realizing a Network. An instance of Network Template may be used to create multiple Networks'
-
- operation :index do
- description 'List all Network Templates in the NetworkTemplateCollection'
- param :CIMISelect, :string, :optional
- control do
- network_templates = NetworkTemplateCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml {network_templates.to_xml}
- format.json {network_templates.to_json}
- end
- end
- end
-
- operation :show do
- description 'Show a specific Network Template'
- param :id, :string, :required
- control do
- network_template = NetworkTemplate.find(params[:id], self)
- respond_to do |format|
- format.xml {network_template.to_xml}
- format.json {network_template.to_json}
- end
- end
- end
-
-end
-
-
-global_collection :routing_groups do
-
- description 'Routing Groups represent a collection of Networks that route to each other. Providers shall not allow two Networks to be routable to each other unless they are explicitly connected by being part of a common RoutingGroup.'
-
- operation :index do
- description 'List all RoutingGroups in the RoutingGroupsCollection'
- param :CIMISelect, :string, :optional
- control do
- routing_groups = RoutingGroupCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml {routing_groups.to_xml}
- format.json {routing_groups.to_json}
- end
- end
- end
-
- operation :show do
- description 'Show a specific RoutingGroup'
- param :id, :string, :required
- control do
- routing_group = RoutingGroup.find(params[:id], self)
- respond_to do |format|
- format.xml {routing_group.to_xml}
- format.json {routing_group.to_json}
- end
- end
- end
-
-end
-
-
-global_collection :routing_group_templates do
-
- description 'Routing Groups Templates capture the configuration values for realizing a RoutingGroup. A Routing Group Template may be used to create multiple RoutingGroups'
-
- operation :index do
- description 'List all RoutingGroupTemplates in the RoutingGroupTemplateCollection'
- param :CIMISelect, :string, :optional
- control do
- routing_group_templates = RoutingGroupTemplateCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml {routing_group_templates.to_xml}
- format.json {routing_group_templates.to_json}
- end
- end
- end
-
- operation :show do
- description 'Show a specific RoutingGroupTemplate'
- param :id, :string, :required
- control do
- routing_group_template = RoutingGroupTemplate.find(params[:id], self)
- respond_to do |format|
- format.xml {routing_group_template.to_xml}
- format.json {routing_group_template.to_json}
- end
- end
- end
-
-end
-
-
-global_collection :vsps do
-
- description 'A VSP represents the connection parameters of a network port'
-
- operation :index do
- description 'List all VSPs in the VSPCollection'
- param :CIMISelect, :string, :optional
- control do
- vsps = VSPCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml {vsps.to_xml}
- format.json {vsps.to_json}
- end
- end
- end
-
- operation :show do
- description 'Show a specific VSP'
- param :id, :string, :required
- control do
- vsp = VSP.find(params[:id], self)
- respond_to do |format|
- format.xml {vsp.to_xml}
- format.json {vsp.to_json}
- end
- end
- end
-
- operation :create do
- description "Create a new VSP"
- control do
- if request.content_type.end_with?("json")
- vsp = CIMI::Model::VSP.create(request.body.read, self, :json)
- else
- vsp = CIMI::Model::VSP.create(request.body.read, self, :xml)
- end
- respond_to do |format|
- format.xml { vsp.to_xml }
- format.json { vsp.to_json }
- end
- end
- end
-
- operation :destroy do
- description "Delete a specified VSP"
- param :id, :string, :required
- control do
- CIMI::Model::VSP.delete!(params[:id], self)
- no_content_with_status(200)
- end
- end
-
- operation :start, :method => :post, :member => true do
- description "Start specific VSP."
- param :id, :string, :required
- control do
- vsp = VSP.find(params[:id], self)
- report_error(404) unless vsp
- if request.content_type.end_with?("json")
- action = Action.from_json(request.body.read)
- else
- action = Action.from_xml(request.body.read)
- end
- vsp.perform(action, self) do |operation|
- no_content_with_status(202) if operation.success?
- # Handle errors using operation.failure?
- end
- end
- end
-
- operation :stop, :method => :post, :member => true do
- description "Stop specific VSP."
- param :id, :string, :required
- control do
- vsp = VSP.find(params[:id], self)
- report_error(404) unless vsp
- if request.content_type.end_with?("json")
- action = Action.from_json(request.body.read)
- else
- action = Action.from_xml(request.body.read)
- end
- vsp.perform(action, self) do |operation|
- no_content_with_status(202) if operation.success?
- # Handle errors using operation.failure?
- end
- end
- end
-
-end
-
-global_collection :vsp_configurations do
-
- description 'A VSP Configuration is the set of configuration values representing the information needed to create a VSP with certain characteristics'
-
- operation :index do
- description 'List all VSPConfigurations in the VSPConfigurationCollection'
- param :CIMISelect, :string, :optional
- control do
- vsp_configs = VSPConfigurationCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml {vsp_configs.to_xml}
- format.json {vsp_configs.to_json}
- end
- end
- end
-
- operation :show do
- description 'Show a specific VSPConfiguration'
- param :id, :string, :required
- control do
- vsp_config = VSPConfiguration.find(params[:id], self)
- respond_to do |format|
- format.xml {vsp_config.to_xml}
- format.json {vsp_config.to_json}
- end
- end
- end
-
-end
-
-
-global_collection :vsp_templates do
-
- description 'The VSP Template is a set of Configuration values for realizing a VSP. A VSP Template may be used to create multiple VSPs'
-
- operation :index do
- description 'List all VSPTemplates in the VSPTemplateCollection'
- param :CIMISelect, :string, :optional
- control do
- vsp_templates = VSPTemplateCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml {vsp_templates.to_xml}
- format.json {vsp_templates.to_json}
- end
- end
- end
-
- operation :show do
- description 'Show a specific VSPTemplate'
- param :id, :string, :required
- control do
- vsp_template = VSPTemplate.find(params[:id], self)
- respond_to do |format|
- format.xml {vsp_template.to_xml}
- format.json {vsp_template.to_json}
- end
- end
- end
-
-end
-
-global_collection :addresses do
-
- description 'An Address represents an IP address, and its associated metdata, for a particular Network.'
-
- operation :index do
- description 'List all Addresses in the AddressCollection'
- param :CIMISelect, :string, :optional
- control do
- addresses = AddressCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml {addresses.to_xml}
- format.json {addresses.to_json}
- end
- end
- end
-
- operation :show do
- description 'Show a specific Address'
- param :id, :string, :required
- control do
- address = CIMI::Model::Address.find(params[:id], self)
- respond_to do |format|
- format.xml {address.to_xml}
- format.json {address.to_json}
- end
- end
- end
-
- operation :create do
- description "Create a new Address"
- control do
- if request.content_type.end_with?("json")
- address = CIMI::Model::Address.create(request.body.read, self, :json)
- else
- address = CIMI::Model::Address.create(request.body.read, self, :xml)
- end
- respond_to do |format|
- format.xml { address.to_xml }
- format.json { address.to_json }
- end
- end
- end
-
- operation :destroy do
- description "Delete a specified Address"
- param :id, :string, :required
- control do
- CIMI::Model::Address.delete!(params[:id], self)
- no_content_with_status(200)
- end
- end
-
-end
-
-
-global_collection :address_templates do
-
- description 'An AddressTemplate captures the configuration values for realizing an Address. An Address Template may be used to create multiple Addresses.'
-
- operation :index do
- description 'List all AddressTemplates in the AddressTemplateCollection'
- param :CIMISelect, :string, :optional
- control do
- address_templates = AddressTemplateCollection.default(self).filter_by(params[:CIMISelect])
- respond_to do |format|
- format.xml {address_templates.to_xml}
- format.json {address_templates.to_json}
- end
- end
- end
-
- operation :show do
- description 'Show a specific AddressTemplate'
- param :id, :string, :required
- control do
- address_template = CIMI::Model::AddressTemplate.find(params[:id], self)
- respond_to do |format|
- format.xml {address_template.to_xml}
- format.json {address_template.to_json}
- end
- end
- end
-
end
--
1.7.10.1