From: Michal Fojtik <[email protected]>
Signed-off-by: Michal fojtik <[email protected]> --- server/lib/cimi/collections/machine_templates.rb | 73 ++++++++++++++++++++++++ server/lib/cimi/models/machine_template.rb | 63 ++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 server/lib/cimi/collections/machine_templates.rb diff --git a/server/lib/cimi/collections/machine_templates.rb b/server/lib/cimi/collections/machine_templates.rb new file mode 100644 index 0000000..17dfbd1 --- /dev/null +++ b/server/lib/cimi/collections/machine_templates.rb @@ -0,0 +1,73 @@ +# 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 MachineTemplates < Base + + set :capability, lambda { |t| true } + + collection :machine_templates do + + operation :index do + description "List all machine templates" + control do + machine_templates = MachineTemplate.list(self).filter_by(params['$select']) + respond_to do |format| + format.xml { machine_templates.to_xml } + format.json { machine_templates.to_json } + end + end + end + + operation :show do + description "Show specific machine template" + control do + machine_template = MachineTemplate.find(params[:id], self) + respond_to do |format| + format.xml { machine_template.to_xml } + format.json { machine_template.to_json } + end + end + end + + operation :create do + description "Create new machine template" + control do + if request.content_type.end_with?("json") + new_machine_template = MachineTemplate.create_from_json(request.body.read, self) + else + new_machine_template = MachineTemplate.create_from_xml(request.body.read, self) + end + status 201 # Created + headers 'Location' => new_machine_template.id + respond_to do |format| + format.json { new_machine_template.to_json } + format.xml { new_machine_template.to_xml } + end + end + end + + operation :destroy do + description "Delete a specified machine template" + control do + MachineTemplate.delete!(params[:id], self) + no_content_with_status(200) + end + end + + end + + end +end diff --git a/server/lib/cimi/models/machine_template.rb b/server/lib/cimi/models/machine_template.rb index 7b64b98..fbc6326 100644 --- a/server/lib/cimi/models/machine_template.rb +++ b/server/lib/cimi/models/machine_template.rb @@ -40,4 +40,67 @@ class CIMI::Model::MachineTemplate < CIMI::Model::Base array :operations do scalar :rel, :href end + + class << self + def find(id, context) + if id == :all + context.current_db.machine_template_entities.all.map { |t| from_db(t, context) } + else + template = context.current_db.machine_template_entities.first(:id => id) + raise CIMI::Model::NotFound unless template + from_db(template, context) + end + end + + def create_from_json(body, context) + json = JSON.parse(body) + new_template = context.current_db.machine_template_entities.new( + :name => json['name'], + :description => json['description'], + :machine_config => json['machineConfig']['href'], + :machine_image => json['machineImage']['href'], + :ent_properties => json['properties'].to_json, + :be_kind => 'machine_template', + :be_id => '' + ) + new_template.save! + from_db(new_template, context) + end + + def create_from_xml(body, context) + xml = XmlSimple.xml_in(body) + new_template = context.current_db.machine_template_entities.new( + :name => xml['name'].first, + :description => xml['description'].first, + :machine_config => xml['machineConfig'].first['href'], + :machine_image => xml['machineImage'].first['href'], + :ent_properties => xml['properties'].first.to_json, + :be_kind => 'machine_template', + :be_id => '' + ) + new_template.save! + from_db(new_template, context) + end + + def delete!(id, context) + context.current_db.machine_template_entities.first(:id => id).destroy + end + + private + + def from_db(model, context) + self.new( + :id => context.machine_template_url(model.id), + :name => model.name, + :description => model.description, + :machine_config => { :href => model.machine_config }, + :machine_image => { :href => model.machine_image }, + :property => model.ent_properties, + :operations => [ + { :href => context.destroy_machine_template_url(model.id), :rel => 'http://schemas.dmtf.org/cimi/1/action/delete' } + ] + ) + end + end + end -- 1.8.0
