You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by ma...@redhat.com on 2012/04/06 18:01:16 UTC
[PATCH 01/11] CIMI: Adds Network create for server and Network model
From: marios <ma...@redhat.com>
Signed-off-by: marios <ma...@redhat.com>
---
server/lib/cimi/helpers/cimi_helper.rb | 6 ++++
server/lib/cimi/model/errors.rb | 8 ++++++
server/lib/cimi/model/network.rb | 41 ++++++++++++++++++++++++++-----
server/lib/cimi/server.rb | 6 ++--
4 files changed, 51 insertions(+), 10 deletions(-)
diff --git a/server/lib/cimi/helpers/cimi_helper.rb b/server/lib/cimi/helpers/cimi_helper.rb
index f67460b..b3f3493 100644
--- a/server/lib/cimi/helpers/cimi_helper.rb
+++ b/server/lib/cimi/helpers/cimi_helper.rb
@@ -20,6 +20,12 @@ module CIMIHelper
status code
end
+
+ def href_id(href, entity)
+ split_on = self.send(:"#{entity.to_s}_url")
+ href.split("#{split_on}/").last
+ end
+
end
helpers CIMIHelper
diff --git a/server/lib/cimi/model/errors.rb b/server/lib/cimi/model/errors.rb
index 9fb82f1..7c090ed 100644
--- a/server/lib/cimi/model/errors.rb
+++ b/server/lib/cimi/model/errors.rb
@@ -25,6 +25,14 @@ module CIMI::Model
end
+ class BadRequest < StandardError
+ attr_accessor :code
+ def initialize(msg="")
+ super(msg)
+ self.code=400
+ end
+ end
+
class NotImplemented < StandardError
attr_accessor :code
diff --git a/server/lib/cimi/model/network.rb b/server/lib/cimi/model/network.rb
index 08fcd97..5d95919 100644
--- a/server/lib/cimi/model/network.rb
+++ b/server/lib/cimi/model/network.rb
@@ -51,19 +51,46 @@ class CIMI::Model::Network < CIMI::Model::Base
networks
end
- def self.create_from_xml(request_body, context)
-#FIXME
- end
-
- def self.create_from_json(request_body,context)
-#FIXME
+ def self.create(request_body, context, type)
+ input = (type == :xml)? XmlSimple.xml_in(request_body, 'ForceArray'=>false) : 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)
- #FIXME
end
#FIXME
#actions - needs method(s) to facilitate stop/start/suspend/delete
+ 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)
+ 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/server.rb b/server/lib/cimi/server.rb
index 0f62951..c58bf87 100644
--- a/server/lib/cimi/server.rb
+++ b/server/lib/cimi/server.rb
@@ -523,10 +523,10 @@ global_collection :networks do
operation :create do
description "Create a new Network"
control do
- if request.content_type.end_with("+json")
- network = Network.create_from_json(request.body.read, self)
+ if request.content_type.end_with?("+json")
+ network = Network.create(request.body.read, self, :json)
else
- network = Network.create_from_xml(request.body.read, self)
+ network = Network.create(request.body.read, self, :xml)
end
respond_to do |format|
format.xml { network.to_xml}
--
1.7.6.5