deltacloud-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "marios@redhat.com" <mandr...@redhat.com>
Subject Re: [PATCH] CIMI: adding system support
Date Fri, 08 Feb 2013 17:13:47 GMT
Hi Dies:

On 08/02/13 14:10, Koper, Dies wrote:
> This is a work in progress. At the moment I'm not making any progress
> though:
> 

unfortunately the patch won't apply - I think you need to rebase it and
send again. I couldn't spot the problem from a visual inspection - but
there's a lot of code there so hopefully I can have a better look with a
fresh patch on Monday,

thanks, marios


> When listing systems or system templates, I get the following trace:
> 
>>> Listening on localhost:3001, CTRL+C to stop
> list(#<CIMI::Collections::SystemTemplates:0xc4c2690>) called.
> system_template#self.find called
> reached mock's system_templates with opts:
> env#<CIMI::Collections::SystemTemplates:0xc4c2690>
> dir: /var/tmp/deltacloud-mock-diesk/cimi/system_template/*.json
> model_files:
> /var/tmp/deltacloud-mock-diesk/cimi/system_template/template1.json
> raw templates from files: #<CIMI::Model::SystemTemplate:0xc3b28f0>
> cimi_object.name = system template 1
> context = #<CIMI::Collections::SystemTemplates:0xc4c2690>
> Templates from driver 1
> entries:
> entries:
> E, [2013-02-08T22:36:49.092238 #8748] ERROR -- 500: [NoMethodError]
> undefined method `size' for nil:NilClass
> 
> d:/sources/OSS/cloud/deltacloud/server/lib/cimi/models/collection.rb:142
> :in `list'
> d:/sources/OSS/cloud/deltacloud/server/lib/cimi/collections/system_templ
> ates.rb:26
> D:/programs/Ruby187/lib/ruby/gems/1.8/gems/sinatra-rabbit-1.1.3/lib/sina
> tra/rabbit/base.rb:396:in `instance_eval'
> D:/programs/Ruby187/lib/ruby/gems/1.8/gems/sinatra-rabbit-1.1.3/lib/sina
> tra/rabbit/base.rb:396:in `GET /system_templates'
> 
> It seems 'entries' is nil. It is supposed to be set in the find method.
> But I don't know which find method. I've put puts methods in all system
> related model's find methods but none get called.
> My model's system(_template).find does get called once at the beginning
> of the stack (see debug output above) so I'm wondering what find method
> it is trying to call anyway.
> 
> Many of the system_ subcollections are copied and pasted from existing
> classes (network.rb ?) and may still have original code.
> I believe in most cases those methods wouldn't be called anyway and can
> be removed.
> 
> Regards,
> Dies Koper
> 
> 
>> -----Original Message-----
>> From: diesk@fast.au.fujitsu.com [mailto:diesk@fast.au.fujitsu.com]
>> Sent: Friday, 8 February 2013 10:44 PM
>> To: dev@deltacloud.apache.org
>> Subject: [PATCH] CIMI: adding system support
>>
>> From: Dies Koper <diesk@fast.au.fujitsu.com>
>>
>> ---
>>  server/lib/cimi/collections/addresses.rb           |   2 +-
>>  server/lib/cimi/collections/machines.rb            |   2 +-
>>  server/lib/cimi/collections/system_templates.rb    |  72 ++++++++
>>  server/lib/cimi/collections/systems.rb             | 198
>> +++++++++++++++++++++
>>  server/lib/cimi/models.rb                          |  10 ++
>>  server/lib/cimi/models/base.rb                     |   4 +-
>>  server/lib/cimi/models/collection.rb               |   3 +
>>  server/lib/cimi/models/system.rb                   |  78 ++++++++
>>  server/lib/cimi/models/system_address.rb           |  90 ++++++++++
>>  server/lib/cimi/models/system_forwarding_group.rb  |  90 ++++++++++
>>  server/lib/cimi/models/system_machine.rb           |  90 ++++++++++
>>  server/lib/cimi/models/system_network.rb           |  90 ++++++++++
>>  server/lib/cimi/models/system_system.rb            |  32 ++++
>>  server/lib/cimi/models/system_template.rb          |  66 +++++++
>>  server/lib/cimi/models/system_volume.rb            |  90 ++++++++++
>>  .../drivers/mock/data/cimi/system/system1.json     |  12 ++
>>  .../mock/data/cimi/system_template/template1.json  |  27 +++
>>  server/lib/deltacloud/drivers/mock/mock_client.rb  |   2 +
>>  .../drivers/mock/mock_driver_cimi_methods.rb       |  27 +++
>>  19 files changed, 981 insertions(+), 4 deletions(-)
>>  create mode 100644 server/lib/cimi/collections/system_templates.rb
>>  create mode 100644 server/lib/cimi/collections/systems.rb
>>  create mode 100644 server/lib/cimi/models/system.rb
>>  create mode 100644 server/lib/cimi/models/system_address.rb
>>  create mode 100644 server/lib/cimi/models/system_forwarding_group.rb
>>  create mode 100644 server/lib/cimi/models/system_machine.rb
>>  create mode 100644 server/lib/cimi/models/system_network.rb
>>  create mode 100644 server/lib/cimi/models/system_system.rb
>>  create mode 100644 server/lib/cimi/models/system_template.rb
>>  create mode 100644 server/lib/cimi/models/system_volume.rb
>>  create mode 100644
>> server/lib/deltacloud/drivers/mock/data/cimi/system/system1.json
>>  create mode 100644
>> server/lib/deltacloud/drivers/mock/data/cimi/system_template/templat
>> e1.json
>>
>> diff --git a/server/lib/cimi/collections/addresses.rb
>> b/server/lib/cimi/collections/addresses.rb
>> index 9ea1764..a51e658 100644
>> --- a/server/lib/cimi/collections/addresses.rb
>> +++ b/server/lib/cimi/collections/addresses.rb
>> @@ -20,7 +20,7 @@ module CIMI::Collections
>>
>>      collection :addresses do
>>
>> -      description 'An Address represents an IP address, and its
>> associated metdata, for a particular Network.'
>> +      description 'An Address represents an IP address, and its
>> associated metadata, for a particular Network.'
>>
>>        operation :index, :with_capability => :addresses do
>>          description 'List all Addresses in the AddressCollection'
>> diff --git a/server/lib/cimi/collections/machines.rb
>> b/server/lib/cimi/collections/machines.rb
>> index 5718f46..9a71bb1 100644
>> --- a/server/lib/cimi/collections/machines.rb
>> +++ b/server/lib/cimi/collections/machines.rb
>> @@ -85,7 +85,7 @@ module CIMI::Collections
>>        end
>>
>>        action :restart, :with_capability => :reboot_instance do
>> -        description "Start specific machine."
>> +        description "Restart specific machine."
>>          param :id,          :string,    :required
>>          control do
>>            machine = Machine.find(params[:id], self)
>> diff --git a/server/lib/cimi/collections/system_templates.rb
>> b/server/lib/cimi/collections/system_templates.rb
>> new file mode 100644
>> index 0000000..88fbe30
>> --- /dev/null
>> +++ b/server/lib/cimi/collections/system_templates.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.
>> +
>> +module CIMI::Collections
>> +  class SystemTemplates < Base
>> +
>> +    set :capability, lambda { |t| true }
>> +
>> +    collection :system_templates do
>> +
>> +      operation :index do
>> +        description "List all system templates"
>> +        control do
>> +          system_templates =
>> CIMI::Model::SystemTemplate.list(self).select_by(params['$select'])
>> +          respond_to do |format|
>> +            format.xml { system_templates.to_xml }
>> +            format.json { system_templates.to_json }
>> +          end
>> +        end
>> +      end
>> +
>> +      operation :show do
>> +        description "Show specific system template"
>> +        control do
>> +          system_template =
>> CIMI::Model::SystemTemplate.find(params[:id], self)
>> +          respond_to do |format|
>> +            format.xml { system_template.to_xml }
>> +            format.json { system_template.to_json }
>> +          end
>> +        end
>> +      end
>> +
>> +      operation :create do
>> +        description "Create new system template"
>> +        control do
>> +          if grab_content_type(request.content_type, request.body)
>> == :json
>> +            new_system_template =
>> CIMI::Model::SystemTemplate.create_from_json(request.body.read, self)
>> +          else
>> +            new_system_template =
>> CIMI::Model::SystemTemplate.create_from_xml(request.body.read, self)
>> +          end
>> +          headers_for_create new_system_template
>> +          respond_to do |format|
>> +            format.json { new_system_template.to_json }
>> +            format.xml { new_system_template.to_xml }
>> +          end
>> +        end
>> +      end
>> +
>> +      operation :destroy do
>> +        description "Delete a specified system template"
>> +        control do
>> +          CIMI::Model::SystemTemplate.delete!(params[:id], self)
>> +          no_content_with_status(200)
>> +        end
>> +      end
>> +
>> +    end
>> +
>> +  end
>> +end
>> diff --git a/server/lib/cimi/collections/systems.rb
>> b/server/lib/cimi/collections/systems.rb
>> new file mode 100644
>> index 0000000..250b1d2
>> --- /dev/null
>> +++ b/server/lib/cimi/collections/systems.rb
>> @@ -0,0 +1,198 @@
>> +# 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 Systems < Base
>> +
>> +    set :capability, lambda { |m| driver.respond_to? m }
>> +
>> +    collection :systems do
>> +      description 'List all systems'
>> +
>> +      operation :index, :with_capability => :systems do
>> +        description "List all systems"
>> +        control do
>> +          systems =
>> System.list(self).select_by(params['$select']).filter_by(params['$fi
>> lter'])
>> +          respond_to do |format|
>> +            format.xml { systems.to_xml }
>> +            format.json { systems.to_json }
>> +          end
>> +        end
>> +      end
>> +
>> +      operation :show, :with_capability => :system do
>> +        description "Show specific system."
>> +        control do
>> +          system = System.find(params[:id], self)
>> +          respond_to do |format|
>> +            format.xml { system.to_xml }
>> +            format.json { system.to_json }
>> +          end
>> +        end
>> +      end
>> +
>> +      operation :create, :with_capability => :create_system do
>> +        description "Create a new System entity."
>> +        control do
>> +          if grab_content_type(request.content_type, request.body)
>> == :json
>> +            new_system = System.create_from_json(request.body.read,
>> self)
>> +          else
>> +            new_system = System.create_from_xml(request.body.read,
>> self)
>> +          end
>> +          headers_for_create new_system
>> +          respond_to do |format|
>> +            format.json { new_system.to_json }
>> +            format.xml { new_system.to_xml }
>> +          end
>> +        end
>> +      end
>> +
>> +      operation :destroy, :with_capability => :destroy_system do
>> +        description "Delete a specified system."
>> +        control do
>> +          System.delete!(params[:id], self)
>> +          no_content_with_status(200)
>> +        end
>> +      end
>> +
>> +      action :stop, :with_capability => :stop_system do
>> +        description "Stop specific system."
>> +        param :id,          :string,    :required
>> +        control do
>> +          system = System.find(params[:id], self)
>> +          if grab_content_type(request.content_type, request.body)
>> == :json
>> +            action = Action.from_json(request.body.read)
>> +          else
>> +            action = Action.from_xml(request.body.read)
>> +          end
>> +          system.perform(action, self) do |operation|
>> +            no_content_with_status(202) if operation.success?
>> +            # Handle errors using operation.failure?
>> +          end
>> +        end
>> +      end
>> +
>> +      action :restart, :with_capability => :reboot_system do
>> +        description "Restart specific system."
>> +        param :id,          :string,    :required
>> +        control do
>> +          system = System.find(params[:id], self)
>> +          if  grab_content_type(request.content_type, request.body)
>> == :json
>> +            action =
>> Action.from_json(request.body.read.gsub("restart", "reboot"))
>> +          else
>> +            action =
>> Action.from_xml(request.body.read.gsub("restart", "reboot"))
>> +          end
>> +          system.perform(action, self) do |operation|
>> +            no_content_with_status(202) if operation.success?
>> +            # Handle errors using operation.failure?
>> +          end
>> +        end
>> +      end
>> +
>> +      action :start, :with_capability => :start_system do
>> +        description "Start specific system."
>> +        param :id,          :string,    :required
>> +        control do
>> +          system = System.find(params[:id], self)
>> +          if  grab_content_type(request.content_type, request.body)
>> == :json
>> +            action = Action.from_json(request.body.read)
>> +          else
>> +            action = Action.from_xml(request.body.read)
>> +          end
>> +          system.perform(action, self) do |operation|
>> +            no_content_with_status(202) if operation.success?
>> +            # Handle errors using operation.failure?
>> +          end
>> +        end
>> +      end
>> +
>> +      action :pause, :with_capability => :pause_system do
>> +        description "Pause specific system."
>> +        param :id,          :string,    :required
>> +        control do
>> +          system = System.find(params[:id], self)
>> +          if  grab_content_type(request.content_type, request.body)
>> == :json
>> +            action = Action.from_json(request.body.read)
>> +          else
>> +            action = Action.from_xml(request.body.read)
>> +          end
>> +          system.perform(action, self) do |operation|
>> +            no_content_with_status(202) if operation.success?
>> +            # Handle errors using operation.failure?
>> +          end
>> +        end
>> +      end
>> +
>> +      action :suspend, :with_capability => :suspend_system do
>> +        description "Suspend specific system."
>> +        param :id,          :string,    :required
>> +        control do
>> +          system = System.find(params[:id], self)
>> +          if  grab_content_type(request.content_type, request.body)
>> == :json
>> +            action = Action.from_json(request.body.read)
>> +          else
>> +            action = Action.from_xml(request.body.read)
>> +          end
>> +          system.perform(action, self) do |operation|
>> +            no_content_with_status(202) if operation.success?
>> +            # Handle errors using operation.failure?
>> +          end
>> +        end
>> +      end
>> +
>> +      #use rabbit subcollections for volumes index/show:
>> +      collection :volumes, :with_id => :vol_id do
>> +
>> +        operation :index, :with_capability => :storage_volumes do
>> +          description "Retrieve the System's SystemVolumeCollection"
>> +          control do
>> +            volumes =
>> CIMI::Model::SystemVolume.collection_for_instance(params[:id], self)
>> +            respond_to do |format|
>> +              format.json {volumes.to_json}
>> +              format.xml  {volumes.to_xml}
>> +            end
>> +          end
>> +        end
>> +
>> +        operation :show, :with_capability => :storage_volumes do
>> +          description "Retrieve a System's specific SystemVolume"
>> +          control do
>> +            volume = CIMI::Model::SystemVolume.find(params[:id],
> self,
>> params[:vol_id])
>> +            respond_to do |format|
>> +              format.json {volume.to_json}
>> +              format.xml  {volume.to_xml}
>> +            end
>> +          end
>> +        end
>> +
>> +        operation :destroy, :with_capability
>> => :detach_storage_volume do
>> +          description "Remove/detach a volume from the System's
>> SystemVolumeCollection"
>> +          control do
>> +            system_volume =
>> CIMI::Model::SystemVolume.find(params[:id], self, params[:vol_id])
>> +            location = system_volume.initial_location
>> +            system_volumes = System.detach_volume(params[:vol_id],
>> location, self)
>> +            respond_to do |format|
>> +              format.json{ system_volumes.to_json}
>> +              format.xml{ system_volumes.to_xml}
>> +            end
>> +          end
>> +        end
>> +
>> +      end
>> +
>> +    end
>> +
>> +  end
>> +end
>> diff --git a/server/lib/cimi/models.rb b/server/lib/cimi/models.rb
>> index 20c0ef1..ec1a1c9 100644
>> --- a/server/lib/cimi/models.rb
>> +++ b/server/lib/cimi/models.rb
>> @@ -81,3 +81,13 @@ require_relative './models/address'
>>  require_relative './models/address_template'
>>  require_relative './models/forwarding_group'
>>  require_relative './models/forwarding_group_template'
>> +require_relative './models/system_system'
>> +require_relative './models/system_volume'
>> +require_relative './models/system_machine'
>> +require_relative './models/system_template'
>> +#require_relative './models/system_credential'
>> +#require_relative './models/system_network_port'
>> +require_relative './models/system_network'
>> +require_relative './models/system_address'
>> +require_relative './models/system_forwarding_group'
>> +require_relative './models/system'
>> diff --git a/server/lib/cimi/models/base.rb
>> b/server/lib/cimi/models/base.rb
>> index c74b8c3..2c49c75 100644
>> --- a/server/lib/cimi/models/base.rb
>> +++ b/server/lib/cimi/models/base.rb
>> @@ -63,7 +63,7 @@ require_relative '../helpers/database_helper'
>>  #   [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
>> +#     that should receive the content of the corresponding XML
> element
>>  #   [array(name, opts, &block)]
>>  #     An array of structured subobjects; the block defines the schema
>> of
>>  #     the subobjects.
>> @@ -86,7 +86,7 @@ module CIMI::Model
>>      #
>>      # Common attributes for all resources
>>      #
>> -    text :id, :name, :description, :created
>> +    text :id, :name, :description, :created, :updated
>>      hash :property
>>    end
>>
>> diff --git a/server/lib/cimi/models/collection.rb
>> b/server/lib/cimi/models/collection.rb
>> index f36c081..17ad95b 100644
>> --- a/server/lib/cimi/models/collection.rb
>> +++ b/server/lib/cimi/models/collection.rb
>> @@ -121,7 +121,9 @@ module CIMI::Model
>>
>>      # Return a collection of entities
>>      def list(context)
>> +	  puts "list(#{context}) called."
>>        entries = find(:all, context)
>> +	  puts "entries: #{entries}"
>>        desc = "#{self.name.split("::").last} Collection for the
>> #{context.driver.name.capitalize} driver"
>>        acts_as_root_entity unless collection_class
>>        id = context.send("#{collection_class.entry_name}_url")
>> @@ -135,6 +137,7 @@ module CIMI::Model
>>          url = context.send(cimi_create)
>>          ops << { :rel => "add", :href => url }
>>        end
>> +	  puts "entries: #{entries}"
>>        collection_class.new(:id => id,
>>                             :count => entries.size,
>>                             :entries => entries,
>> diff --git a/server/lib/cimi/models/system.rb
>> b/server/lib/cimi/models/system.rb
>> new file mode 100644
>> index 0000000..619e7a9
>> --- /dev/null
>> +++ b/server/lib/cimi/models/system.rb
>> @@ -0,0 +1,78 @@
>> +# 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::System < CIMI::Model::Base
>> +
>> +  acts_as_root_entity
>> +
>> +  text :state
>> +
>> +  collection :systems, :class => CIMI::Model::SystemSystem
>> +  collection :machines, :class => CIMI::Model::SystemMachine
>> +#  collection :credentials, :class => CIMI::Model::SystemCredential
>> +  collection :volumes, :class => CIMI::Model::SystemVolume
>> +  collection :networks, :class => CIMI::Model::SystemNetwork
>> +#  collection :network_ports, :class =>
>> CIMI::Model::SystemNetworkPort
>> +  collection :addresses, :class => CIMI::Model::SystemAddress
>> +  collection :forwarding_groups, :class =>
>> CIMI::Model::SystemForwardingGroup
>> +
>> +  array :meters do
>> +    scalar :href
>> +  end
>> +
>> +  href :event_log
>> +
>> +  array :operations do
>> +    scalar :rel, :href
>> +  end
>> +
>> +  def self.find(id, context)
>> +  puts "system#self.find called"
>> +    systems = []
>> +    if id == :all
>> +      systems = context.driver.systems(context.credentials,
>> {:env=>context})
>> +puts "systems from driver #{systems.size}"
>> +    else
>> +      system = context.driver.system(context.credentials,
>> {:env=>context, :id=>id})
>> +      raise CIMI::Model::NotFound unless system
>> +      system
>> +    end
>> +  end
>> +
>> +  def self.create_from_json(body, context)
>> +    #todo: mfojtik and lutter are refactoring this mechanism
>> +  end
>> +
>> +  def self.create_from_xml(body, context)
>> +      #todo: mfojtik and lutter are refactoring this mechanism
>> +  end
>> +
>> +  def perform(action, context, &block)
>> +    begin
>> +      if context.driver.send(:"#{action.name}_system",
>> context.credentials, self.id.split("/").last)
>> +        block.callback :success
>> +      else
>> +        raise "Operation failed to execute on given System"
>> +      end
>> +    rescue => e
>> +      block.callback :failure, e.message
>> +    end
>> +  end
>> +
>> +  def self.delete!(id, context)
>> +    context.driver.destroy_system(context.credentials, id)
>> +  end
>> +
>> +end
>> diff --git a/server/lib/cimi/models/system_address.rb
>> b/server/lib/cimi/models/system_address.rb
>> new file mode 100644
>> index 0000000..a4c88bf
>> --- /dev/null
>> +++ b/server/lib/cimi/models/system_address.rb
>> @@ -0,0 +1,90 @@
>> +# 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::SystemAddress < CIMI::Model::Base
>> +
>> +  href :address
>> +
>> +  array :operations do
>> +    scalar :rel, :href
>> +  end
>> +
>> +  def self.find(instance_id, context, id=:all)
>> +    puts "system_address#self.find called"
>> +    if id == :all
>> +      addresses =
>> context.driver.storage_addresses(context.credentials)
>> +      addresses.inject([]) do |attached, vol|
>> +        id = context.system_url(instance_id)+"/addresses/#{vol.id}"
>> +        attached <<  self.new(
>> +          :id => id,
>> +          :name => vol.id,
>> +          :description => "SystemAddress #{vol.id} for System
>> #{instance_id}",
>> +          :created => vol.created.nil? ? nil :
>> Time.parse(vol.created).xmlschema,
>> +          :initial_location => vol.device,
>> +          :address => {:href=>context.address_url(vol.id)},
>> +          :operations => [{:href=>id, :rel => "delete" }]
>> +          ) if vol.instance_id == instance_id
>> +        attached
>> +      end
>> +    else
>> +      vol = context.driver.storage_address(context.credentials,
>> {:id=>id})
>> +      id = context.system_url(instance_id)+"/addresses/#{vol.id}"
>> +      raise CIMI::Model::NotFound unless vol.instance_id ==
>> instance_id
>> +      self.new(
>> +        :id => id,
>> +        :name => vol.id,
>> +        :description => "SystemAddress #{vol.id} for System
>> #{instance_id}",
>> +        :created => vol.created.nil? ? nil :
>> Time.parse(vol.created).xmlschema,
>> +        :initial_location => vol.device,
>> +        :address => {:href=>context.address_url(vol.id)},
>> +        :operations => [{:href=>id, :rel => "delete" }]
>> +        )
>> +    end
>> +  end
>> +
>> +  def self.find_to_attach_from_xml(xml_in, context)
>> +    xml = XmlSimple.xml_in(xml_in)
>> +    vol_id = xml["address"].first["href"].split("/").last
>> +    location = xml["initialLocation"].first.strip
>> +    [vol_id, location]
>> +  end
>> +
>> +  def self.find_to_attach_from_json(json_in, context)
>> +    json = JSON.parse(json_in)
>> +    vol_id = json["address"]["href"].split("/").last
>> +    location = json["initialLocation"]
>> +    [vol_id, location]
>> +  end
>> +
>> +
>> +  def self.collection_for_instance(instance_id, context)
>> +    system_addresses = self.find(instance_id, context)
>> +    addresses_url = context.url("/systems/#{instance_id}/addresses")
>> +    unless CIMI::Model.const_defined?('SystemAddressCollection')
>> +      collection_class = CIMI::Model::Collection.generate(self)
>> +    else
>> +      collection_class = CIMI::Model::SystemAddressCollection
>> +    end
>> +    collection_class.new(
>> +      :id => addresses_url,
>> +      :name => 'default',
>> +      :count => system_addresses.size,
>> +      :description => "Address collection for System #{instance_id}",
>> +      :entries => system_addresses,
>> +      :operations => [{ :href =>
>> addresses_url.singularize+"_attach", :rel => "add" }]
>> +    )
>> +  end
>> +
>> +end
>> diff --git a/server/lib/cimi/models/system_forwarding_group.rb
>> b/server/lib/cimi/models/system_forwarding_group.rb
>> new file mode 100644
>> index 0000000..95c148c
>> --- /dev/null
>> +++ b/server/lib/cimi/models/system_forwarding_group.rb
>> @@ -0,0 +1,90 @@
>> +# 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::SystemForwardingGroup < CIMI::Model::Base
>> +
>> +  href :forwarding_group
>> +
>> +  array :operations do
>> +    scalar :rel, :href
>> +  end
>> +
>> +  def self.find(instance_id, context, id=:all)
>> +    puts "system_machine#self.find called"
>> +    if id == :all
>> +      forwarding_groups =
>> context.driver.storage_forwarding_groups(context.credentials)
>> +      forwarding_groups.inject([]) do |attached, vol|
>> +        id =
>> context.system_url(instance_id)+"/forwarding_groups/#{vol.id}"
>> +        attached <<  self.new(
>> +          :id => id,
>> +          :name => vol.id,
>> +          :description => "SystemForwardingGroup #{vol.id} for System
>> #{instance_id}",
>> +          :created => vol.created.nil? ? nil :
>> Time.parse(vol.created).xmlschema,
>> +          :initial_location => vol.device,
>> +          :forwarding_group =>
>> {:href=>context.forwarding_group_url(vol.id)},
>> +          :operations => [{:href=>id, :rel => "delete" }]
>> +          ) if vol.instance_id == instance_id
>> +        attached
>> +      end
>> +    else
>> +      vol =
>> context.driver.storage_forwarding_group(context.credentials,
>> {:id=>id})
>> +      id =
>> context.system_url(instance_id)+"/forwarding_groups/#{vol.id}"
>> +      raise CIMI::Model::NotFound unless vol.instance_id ==
>> instance_id
>> +      self.new(
>> +        :id => id,
>> +        :name => vol.id,
>> +        :description => "SystemForwardingGroup #{vol.id} for System
>> #{instance_id}",
>> +        :created => vol.created.nil? ? nil :
>> Time.parse(vol.created).xmlschema,
>> +        :initial_location => vol.device,
>> +        :forwarding_group =>
>> {:href=>context.forwarding_group_url(vol.id)},
>> +        :operations => [{:href=>id, :rel => "delete" }]
>> +        )
>> +    end
>> +  end
>> +
>> +  def self.find_to_attach_from_xml(xml_in, context)
>> +    xml = XmlSimple.xml_in(xml_in)
>> +    vol_id = xml["forwarding_group"].first["href"].split("/").last
>> +    location = xml["initialLocation"].first.strip
>> +    [vol_id, location]
>> +  end
>> +
>> +  def self.find_to_attach_from_json(json_in, context)
>> +    json = JSON.parse(json_in)
>> +    vol_id = json["forwarding_group"]["href"].split("/").last
>> +    location = json["initialLocation"]
>> +    [vol_id, location]
>> +  end
>> +
>> +
>> +  def self.collection_for_instance(instance_id, context)
>> +    system_forwarding_groups = self.find(instance_id, context)
>> +    forwarding_groups_url =
>> context.url("/systems/#{instance_id}/forwarding_groups")
>> +    unless
>> CIMI::Model.const_defined?('SystemForwardingGroupCollection')
>> +      collection_class = CIMI::Model::Collection.generate(self)
>> +    else
>> +      collection_class =
>> CIMI::Model::SystemForwardingGroupCollection
>> +    end
>> +    collection_class.new(
>> +      :id => forwarding_groups_url,
>> +      :name => 'default',
>> +      :count => system_forwarding_groups.size,
>> +      :description => "ForwardingGroup collection for System
>> #{instance_id}",
>> +      :entries => system_forwarding_groups,
>> +      :operations => [{ :href =>
>> forwarding_groups_url.singularize+"_attach", :rel => "add" }]
>> +    )
>> +  end
>> +
>> +end
>> diff --git a/server/lib/cimi/models/system_machine.rb
>> b/server/lib/cimi/models/system_machine.rb
>> new file mode 100644
>> index 0000000..5c96ded
>> --- /dev/null
>> +++ b/server/lib/cimi/models/system_machine.rb
>> @@ -0,0 +1,90 @@
>> +# 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::SystemMachine < CIMI::Model::Base
>> +
>> +  href :machine
>> +
>> +  array :operations do
>> +    scalar :rel, :href
>> +  end
>> +
>> +  def self.find(instance_id, context, id=:all)
>> +    puts "system_machine#self.find called"
>> +    if id == :all
>> +      machines =
>> context.driver.storage_machines(context.credentials)
>> +      machines.inject([]) do |attached, vol|
>> +        id = context.system_url(instance_id)+"/machines/#{vol.id}"
>> +        attached <<  self.new(
>> +          :id => id,
>> +          :name => vol.id,
>> +          :description => "SystemMachine #{vol.id} for System
>> #{instance_id}",
>> +          :created => vol.created.nil? ? nil :
>> Time.parse(vol.created).xmlschema,
>> +          :initial_location => vol.device,
>> +          :machine => {:href=>context.machine_url(vol.id)},
>> +          :operations => [{:href=>id, :rel => "delete" }]
>> +          ) if vol.instance_id == instance_id
>> +        attached
>> +      end
>> +    else
>> +      vol = context.driver.storage_machine(context.credentials,
>> {:id=>id})
>> +      id = context.system_url(instance_id)+"/machines/#{vol.id}"
>> +      raise CIMI::Model::NotFound unless vol.instance_id ==
>> instance_id
>> +      self.new(
>> +        :id => id,
>> +        :name => vol.id,
>> +        :description => "SystemMachine #{vol.id} for System
>> #{instance_id}",
>> +        :created => vol.created.nil? ? nil :
>> Time.parse(vol.created).xmlschema,
>> +        :initial_location => vol.device,
>> +        :machine => {:href=>context.machine_url(vol.id)},
>> +        :operations => [{:href=>id, :rel => "delete" }]
>> +        )
>> +    end
>> +  end
>> +
>> +  def self.find_to_attach_from_xml(xml_in, context)
>> +    xml = XmlSimple.xml_in(xml_in)
>> +    vol_id = xml["machine"].first["href"].split("/").last
>> +    location = xml["initialLocation"].first.strip
>> +    [vol_id, location]
>> +  end
>> +
>> +  def self.find_to_attach_from_json(json_in, context)
>> +    json = JSON.parse(json_in)
>> +    vol_id = json["machine"]["href"].split("/").last
>> +    location = json["initialLocation"]
>> +    [vol_id, location]
>> +  end
>> +
>> +
>> +  def self.collection_for_instance(instance_id, context)
>> +    system_machines = self.find(instance_id, context)
>> +    machines_url = context.url("/systems/#{instance_id}/machines")
>> +    unless CIMI::Model.const_defined?('SystemMachineCollection')
>> +      collection_class = CIMI::Model::Collection.generate(self)
>> +    else
>> +      collection_class = CIMI::Model::SystemMachineCollection
>> +    end
>> +    collection_class.new(
>> +      :id => machines_url,
>> +      :name => 'default',
>> +      :count => system_machines.size,
>> +      :description => "Machine collection for System #{instance_id}",
>> +      :entries => system_machines,
>> +      :operations => [{ :href =>
>> machines_url.singularize+"_attach", :rel => "add" }]
>> +    )
>> +  end
>> +
>> +end
>> diff --git a/server/lib/cimi/models/system_network.rb
>> b/server/lib/cimi/models/system_network.rb
>> new file mode 100644
>> index 0000000..df3f831
>> --- /dev/null
>> +++ b/server/lib/cimi/models/system_network.rb
>> @@ -0,0 +1,90 @@
>> +# 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::SystemNetwork < CIMI::Model::Base
>> +
>> +  href :network
>> +
>> +  array :operations do
>> +    scalar :rel, :href
>> +  end
>> +
>> +  def self.find(instance_id, context, id=:all)
>> +    puts "SystemNetwork#self.find called"
>> +    if id == :all
>> +      networks =
>> context.driver.storage_networks(context.credentials)
>> +      networks.inject([]) do |attached, vol|
>> +        id = context.system_url(instance_id)+"/networks/#{vol.id}"
>> +        attached <<  self.new(
>> +          :id => id,
>> +          :name => vol.id,
>> +          :description => "SystemNetwork #{vol.id} for System
>> #{instance_id}",
>> +          :created => vol.created.nil? ? nil :
>> Time.parse(vol.created).xmlschema,
>> +          :initial_location => vol.device,
>> +          :network => {:href=>context.network_url(vol.id)},
>> +          :operations => [{:href=>id, :rel => "delete" }]
>> +          ) if vol.instance_id == instance_id
>> +        attached
>> +      end
>> +    else
>> +      vol = context.driver.storage_network(context.credentials,
>> {:id=>id})
>> +      id = context.system_url(instance_id)+"/networks/#{vol.id}"
>> +      raise CIMI::Model::NotFound unless vol.instance_id ==
>> instance_id
>> +      self.new(
>> +        :id => id,
>> +        :name => vol.id,
>> +        :description => "SystemNetwork #{vol.id} for System
>> #{instance_id}",
>> +        :created => vol.created.nil? ? nil :
>> Time.parse(vol.created).xmlschema,
>> +        :initial_location => vol.device,
>> +        :network => {:href=>context.network_url(vol.id)},
>> +        :operations => [{:href=>id, :rel => "delete" }]
>> +        )
>> +    end
>> +  end
>> +
>> +  def self.find_to_attach_from_xml(xml_in, context)
>> +    xml = XmlSimple.xml_in(xml_in)
>> +    vol_id = xml["network"].first["href"].split("/").last
>> +    location = xml["initialLocation"].first.strip
>> +    [vol_id, location]
>> +  end
>> +
>> +  def self.find_to_attach_from_json(json_in, context)
>> +    json = JSON.parse(json_in)
>> +    vol_id = json["network"]["href"].split("/").last
>> +    location = json["initialLocation"]
>> +    [vol_id, location]
>> +  end
>> +
>> +
>> +  def self.collection_for_instance(instance_id, context)
>> +    system_networks = self.find(instance_id, context)
>> +    networks_url = context.url("/systems/#{instance_id}/networks")
>> +    unless CIMI::Model.const_defined?('SystemNetworkCollection')
>> +      collection_class = CIMI::Model::Collection.generate(self)
>> +    else
>> +      collection_class = CIMI::Model::SystemNetworkCollection
>> +    end
>> +    collection_class.new(
>> +      :id => networks_url,
>> +      :name => 'default',
>> +      :count => system_networks.size,
>> +      :description => "Network collection for System #{instance_id}",
>> +      :entries => system_networks,
>> +      :operations => [{ :href =>
>> networks_url.singularize+"_attach", :rel => "add" }]
>> +    )
>> +  end
>> +
>> +end
>> diff --git a/server/lib/cimi/models/system_system.rb
>> b/server/lib/cimi/models/system_system.rb
>> new file mode 100644
>> index 0000000..41f9ae7
>> --- /dev/null
>> +++ b/server/lib/cimi/models/system_system.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.
>> +
>> +class CIMI::Model::SystemSystem < CIMI::Model::Base
>> +
>> +  href :system
>> +
>> +  array :operations do
>> +    scalar :rel, :href
>> +  end
>> +
>> +  def self.find(instance_id, context, id=:all)
>> +    puts "SystemSystem#self.find called"
>> +  end
>> +
>> +
>> +  def self.collection_for_instance(instance_id, context)
>> +  end
>> +
>> +end
>> diff --git a/server/lib/cimi/models/system_template.rb
>> b/server/lib/cimi/models/system_template.rb
>> new file mode 100644
>> index 0000000..9cfc64c
>> --- /dev/null
>> +++ b/server/lib/cimi/models/system_template.rb
>> @@ -0,0 +1,66 @@
>> +# 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::SystemTemplate < CIMI::Model::Base
>> +
>> +  acts_as_root_entity
>> +
>> +  array :component_descriptors do
>> +    text :name, :description
>> +    hash :properties
>> +    text :type
>> +    scalar :component_template #or :class => CIMI::Model::Base ?
>> +    text :quantity
>> +  end
>> +
>> +  array :meter_templates do
>> +    scalar :href
>> +  end
>> +
>> +  href :event_log_template
>> +
>> +  array :operations do
>> +    scalar :rel, :href
>> +  end
>> +
>> +  class << self
>> +    def find(id, context)
>> +  puts "system_template#self.find called"
>> +      templates = []
>> +      if id == :all
>> +        templates =
>> context.driver.system_templates(context.credentials, {:env=>context})
>> +puts "Templates from driver #{templates.size}"
>> +      else
>> +        template =
>> context.driver.system_templates(context.credentials,
>> {:env=>context, :id=>id})
>> +        raise CIMI::Model::NotFound unless template
>> +        template
>> +      end
>> +    end
>> +
>> +    def create_from_json(body, context)
>> +      #todo: mfojtik and lutter are refactoring this mechanism
>> +    end
>> +
>> +    def create_from_xml(body, context)
>> +      #todo: mfojtik and lutter are refactoring this mechanism
>> +    end
>> +
>> +    def delete!(id, context)
>> +      context.driver.destroy_system_template(context.credentials,
>> id)
>> +    end
>> +
>> +  end
>> +
>> +end
>> diff --git a/server/lib/cimi/models/system_volume.rb
>> b/server/lib/cimi/models/system_volume.rb
>> new file mode 100644
>> index 0000000..3433402
>> --- /dev/null
>> +++ b/server/lib/cimi/models/system_volume.rb
>> @@ -0,0 +1,90 @@
>> +# 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::SystemVolume < CIMI::Model::Base
>> +
>> +  href :volume
>> +
>> +  array :operations do
>> +    scalar :rel, :href
>> +  end
>> +
>> +  def self.find(instance_id, context, id=:all)
>> +    puts "system_volume#self.find called"
>> +    if id == :all
>> +      volumes = context.driver.storage_volumes(context.credentials)
>> +      volumes.inject([]) do |attached, vol|
>> +        id = context.system_url(instance_id)+"/volumes/#{vol.id}"
>> +        attached <<  self.new(
>> +          :id => id,
>> +          :name => vol.id,
>> +          :description => "SystemVolume #{vol.id} for System
>> #{instance_id}",
>> +          :created => vol.created.nil? ? nil :
>> Time.parse(vol.created).xmlschema,
>> +          :initial_location => vol.device,
>> +          :volume => {:href=>context.volume_url(vol.id)},
>> +          :operations => [{:href=>id, :rel => "delete" }]
>> +          ) if vol.instance_id == instance_id
>> +        attached
>> +      end
>> +    else
>> +      vol = context.driver.storage_volume(context.credentials,
>> {:id=>id})
>> +      id = context.system_url(instance_id)+"/volumes/#{vol.id}"
>> +      raise CIMI::Model::NotFound unless vol.instance_id ==
>> instance_id
>> +      self.new(
>> +        :id => id,
>> +        :name => vol.id,
>> +        :description => "SystemVolume #{vol.id} for System
>> #{instance_id}",
>> +        :created => vol.created.nil? ? nil :
>> Time.parse(vol.created).xmlschema,
>> +        :initial_location => vol.device,
>> +        :volume => {:href=>context.volume_url(vol.id)},
>> +        :operations => [{:href=>id, :rel => "delete" }]
>> +        )
>> +    end
>> +  end
>> +
>> +  def self.find_to_attach_from_xml(xml_in, context)
>> +    xml = XmlSimple.xml_in(xml_in)
>> +    vol_id = xml["volume"].first["href"].split("/").last
>> +    location = xml["initialLocation"].first.strip
>> +    [vol_id, location]
>> +  end
>> +
>> +  def self.find_to_attach_from_json(json_in, context)
>> +    json = JSON.parse(json_in)
>> +    vol_id = json["volume"]["href"].split("/").last
>> +    location = json["initialLocation"]
>> +    [vol_id, location]
>> +  end
>> +
>> +
>> +  def self.collection_for_instance(instance_id, context)
>> +    system_volumes = self.find(instance_id, context)
>> +    volumes_url = context.url("/systems/#{instance_id}/volumes")
>> +    unless CIMI::Model.const_defined?('SystemVolumeCollection')
>> +      collection_class = CIMI::Model::Collection.generate(self)
>> +    else
>> +      collection_class = CIMI::Model::SystemVolumeCollection
>> +    end
>> +    collection_class.new(
>> +      :id => volumes_url,
>> +      :name => 'default',
>> +      :count => system_volumes.size,
>> +      :description => "Volume collection for System #{instance_id}",
>> +      :entries => system_volumes,
>> +      :operations => [{ :href =>
>> volumes_url.singularize+"_attach", :rel => "add" }]
>> +    )
>> +  end
>> +
>> +end
>> diff --git
>> a/server/lib/deltacloud/drivers/mock/data/cimi/system/system1.json
>> b/server/lib/deltacloud/drivers/mock/data/cimi/system/system1.json
>> new file mode 100644
>> index 0000000..450233d
>> --- /dev/null
>> +++
>> b/server/lib/deltacloud/drivers/mock/data/cimi/system/system1.json
>> @@ -0,0 +1,12 @@
>> +{ "id": "http://cimi.example.org/systems/template1",
>> +  "name": "system1",
>> +  "description": "the first system",
>> +  "created": "Fri Feb 08 15:25:41 EET 2013",
>> +  "state": "STOPPED",
>> +  "machines": { "href":
>> "http://cimi.example.org/systems/87654/machines"},
>> +  "networks": { "href":
>> "http://cimi.example.org/systems/87654/networks"},
>> +  "operations": [
>> +    { "rel": "edit", "href":
>> "http://cimi.example.org/networks/network1" },
>> +    { "rel": "delete", "href":
>> "http://cimi.example.org/networks/network1" }
>> +  ]
>> +}
>> diff --git
>> a/server/lib/deltacloud/drivers/mock/data/cimi/system_template/templ
>> ate1.json
>> b/server/lib/deltacloud/drivers/mock/data/cimi/system_template/templ
>> ate1.json
>> new file mode 100644
>> index 0000000..0672df1
>> --- /dev/null
>> +++
>> b/server/lib/deltacloud/drivers/mock/data/cimi/system_template/templ
>> ate1.json
>> @@ -0,0 +1,27 @@
>> +{ "id": "http://cimi.example.org/system_templates/template1",
>> +  "name": "system template 1",
>> +  "description": "A mock system template",
>> +  "created": "Fri Feb 08 12:15:15 EET 2013",
>> +  "componentDescriptors": [
>> +    { "name": "my machine",
>> +      "description": "an inline mock machine template",
>> +      "type": "http://schemas.dmtf.org/cimi/1/Machine",
>> +      "machineTemplate": {
>> +        "name": "machine in mock system",
>> +        "description": "machine in ststem",
>> +        "machineConfig": "http://example.com/configs/m1-small",
>> +        "machineImage": "http://example.com/images/img1"
>> +      }
>> +    },
>> +    { "name": "my network",
>> +      "description": "a reference to an existing mock network
> template",
>> +      "type": "http://schemas.dmtf.org/cimi/1/Network",
>> +      "networkTemplate": {
>> +        "href":
>> "http://cimi.example.org/network_templates/template1"
>> +      }
>> +    }
>> +  ],
>> +  "operations": [
>> +    { "rel": "edit", "href":
>> "http://cimi.example.org/network_templates/template1" },
>> +    { "rel": "delete", "href":
>> "http://cimi.example.org/network_templates/template1" }]
>> +}
>> diff --git a/server/lib/deltacloud/drivers/mock/mock_client.rb
>> b/server/lib/deltacloud/drivers/mock/mock_client.rb
>> index 449b6a8..d7796a2 100644
>> --- a/server/lib/deltacloud/drivers/mock/mock_client.rb
>> +++ b/server/lib/deltacloud/drivers/mock/mock_client.rb
>> @@ -92,7 +92,9 @@ module Deltacloud::Drivers::Mock
>>      end
>>
>>      def load_all_cimi(model_name)
>> +    puts "dir: #{File::join(cimi_dir(model_name), "*.json")}"
>>          model_files = Dir[File::join(cimi_dir(model_name), "*.json")]
>> +        puts "model_files: #{model_files}"
>>          model_files.map{|f| File.read(f)}
>>      end
>>
>> diff --git
>> a/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
>> b/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
>> index 336f77b..57ea5ef 100644
>> --- a/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
>> +++ b/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
>> @@ -20,6 +20,31 @@
>>  module Deltacloud::Drivers::Mock
>>
>>    class MockDriver < Deltacloud::BaseDriver
>> +
>> +    def systems(credentials, opts={})
>> +      check_credentials(credentials)
>> +      if opts[:id].nil?
>> +        systems = @client.load_all_cimi(:system).map{|sys|
>> CIMI::Model::System.from_json(sys)}
>> +        systems.map{|sys|convert_cimi_mock_urls(:system,
>> sys ,opts[:env])}.flatten
>> +      else
>> +        system =
>> CIMI::Model::System.from_json(@client.load_cimi(:system, opts[:id]))
>> +        convert_cimi_mock_urls(:system, system, opts[:env])
>> +      end
>> +    end
>> +
>> +    def system_templates(credentials, opts={})
>> +      check_credentials(credentials)
>> +      puts "reached mock's system_templates with opts: #{opts}"
>> +      if opts[:id].nil?
>> +        system_templates =
>> @client.load_all_cimi(:system_template).map{|sys_templ|
>> CIMI::Model::SystemTemplate.from_json(sys_templ)}
>> +        puts "raw templates from files: #{system_templates}"
>> +
>> system_templates.map{|sys_templ|convert_cimi_mock_urls(:system_templ
>> ate, sys_templ, opts[:env])}.flatten
>> +      else
>> +        system_template =
>> CIMI::Model::SystemTemplate.from_json(@client.load_cimi(:system_temp
>> late, opts[:id]))
>> +        convert_cimi_mock_urls(:system_template, system_template,
>> opts[:env])
>> +      end
>> +    end
>> +
>>      def networks(credentials, opts={})
>>        check_credentials(credentials)
>>        if opts[:id].nil?
>> @@ -138,6 +163,8 @@ module Deltacloud::Drivers::Mock
>>              end
>>          end
>>        end
>> +      puts "cimi_object.name = #{cimi_object.name}"
>> +      puts "context = #{context}"
>>        object_url = context.send(:"#{model_name}_url",
>> cimi_object.name)
>>        cimi_object.id=object_url
>>        cimi_object.operations.each{|op| op.href=object_url  }
>> --
>> 1.8.0.msysgit.0
>>
>>
> 
> 


Mime
View raw message