deltacloud-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Koper, Dies" <di...@fast.au.fujitsu.com>
Subject RE: [PATCH] added MachineTemplate subcollection of SystemTemplate
Date Tue, 26 Feb 2013 10:17:34 GMT
I don't understand how the DB and *Create models are involved.
I get the same result with the fgcp driver (which builds the cimi
objects based on the data from the fgcp api backend, no DB involved.
Also, I'm not using the create operations, just performing a GET.

Regards,
Dies Koper


> -----Original Message-----
> From: Michal Fojtik [mailto:mfojtik@redhat.com]
> Sent: Tuesday, 26 February 2013 9:06 PM
> To: dev@deltacloud.apache.org
> Subject: Re: [PATCH] added MachineTemplate subcollection of
> SystemTemplate
> 
> On 02/25, Koper, Dies wrote:
> 
> Hi,
> 
> I think I know what is going on here. If you look to
MachineTemplateCreate
> model, you'll see we store only informations about machineConfig and
about
> machineImage. The 'volumes' and 'volumeTemplates' arrays are not
> persisted
> in database and so even you create a machineTemplate using 'volumes'
they
> are being currently ignored.
> 
> To support this stuff, we will need to do more work on the database
side.
> For example, to have 'array' of volumes stored in the database, we
will
> need
> to do something like:
> 
> machineTemplate <--> many_to_many(?)  <-->  volumeTemplate
> machineTemplate <--> many_to_many(?)  <-->  volumes
> 
> This will require at least 2 new join tables (machine_template_volumes
> and
> machine_template_volume_templates).
> 
> Maybe there is more nicer solution :-) Any suggestions are welcome.
> 
>   -- Michal
> 
> > I'm looking for help with this one.
> >
> > I'm trying to support the listing of a system_template with a
> > machine_template for a machine with an attached volume of 10 GB.
> > I added volumeTemplates to the 2nd machine in the mock json data
file
> in
> > the patch:
> >
> >     { "name": "my second machine",
> >       "description": "another inline mock machine template",
> >       "type": "http://schemas.dmtf.org/cimi/1/Machine",
> >       "machineTemplate": {
> >         "name": "machine in mock system",
> >         "description": "machine in system",
> >         "machineConfig": { "href":
> "http://example.com/configs/m1-small"
> > },
> >         "machineImage": { "href":
> "http://example.com/images/img1" },
> >         "volumeTemplates": [
> > 	  { "volumeConfig": {"capacity": 10240} }
> > 	]
> >       }
> >     },
> >
> > Then run d:\>curl --user mockuser:mockpassword
> > http://localhost:3001/cimi/system_templates/template1?format=xml
> > The result has the following for the second machine:
> >
> >     <machineTemplate>
> >       <name>machine in mock system</name>
> >       <description>machine in system</description>
> >       <machineConfig href="http://example.com/configs/m1-small" />
> >       <machineImage href="http://example.com/images/img1" />
> >       <volumeTemplate></volumeTemplate>
> >     </machineTemplate>
> >
> > No volumeConfig element with capacity info. Why?
> >
> > Cheers,
> > Dies Koper
> >
> >
> > > -----Original Message-----
> > > From: diesk@fast.au.fujitsu.com [mailto:diesk@fast.au.fujitsu.com]
> > > Sent: Monday, 25 February 2013 11:38 PM
> > > To: dev@deltacloud.apache.org
> > > Subject: [PATCH] added MachineTemplate subcollection of
> SystemTemplate
> > >
> > > From: Dies Koper <diesk@fast.au.fujitsu.com>
> > >
> > > ---
> > >  server/lib/cimi/models/system.rb                   |  4 ++-
> > >  server/lib/cimi/models/system_template.rb          | 19
> ++++++------
> > >  server/lib/deltacloud/drivers/fgcp/fgcp_client.rb  |  4 +++
> > >  .../drivers/fgcp/fgcp_driver_cimi_methods.rb       | 36
> > > ++++++++++++++++++++--
> > >  .../mock/data/cimi/system_template/template1.json  | 25
> > > ++++++++++-----
> > >  .../drivers/mock/mock_driver_cimi_methods.rb       | 32
> > > +++++++++++++++++++
> > >  6 files changed, 100 insertions(+), 20 deletions(-)
> > >
> > > diff --git a/server/lib/cimi/models/system.rb
> > > b/server/lib/cimi/models/system.rb
> > > index e238259..2d5b656 100644
> > > --- a/server/lib/cimi/models/system.rb
> > > +++ b/server/lib/cimi/models/system.rb
> > > @@ -17,7 +17,9 @@ class CIMI::Model::System < CIMI::Model::Base
> > >
> > >    acts_as_root_entity
> > >
> > > -  text :state
> > > +  resource_attr :system_template, :required => false, :type =>
:href
> > > +
> > > +  text :state, :required => true
> > >
> > >  #  collection :systems, :class => CIMI::Model::SystemSystem
> > >  #  collection :machines, :class => CIMI::Model::SystemMachine
> > > diff --git a/server/lib/cimi/models/system_template.rb
> > > b/server/lib/cimi/models/system_template.rb
> > > index 09cd9b0..49e0797 100644
> > > --- a/server/lib/cimi/models/system_template.rb
> > > +++ b/server/lib/cimi/models/system_template.rb
> > > @@ -20,16 +20,17 @@ class CIMI::Model::SystemTemplate <
> > > CIMI::Model::Base
> > >    array :component_descriptors do
> > >      text :name, :description
> > >      hash :properties
> > > -    text :type
> > > +    text :type, :required => true
> > >      #component_template, comprises:
> > > -#    struct :machine_template, :class =>
> CIMI::Model::MachineTemplate
> > > -#    struct :system_template, :class =>
> CIMI::Model::SystemTemplate
> > > -#    struct :credential_template, :class =>
> > > CIMI::Model::CredentialTemplate
> > > -#    struct :volume_template, :class =>
> CIMI::Model::VolumeTemplate
> > > -#    struct :network_template, :class =>
> CIMI::Model::NetworkTemplate
> > > -#    struct :network_port_template, :class =>
> > > CIMI::Model::NetworkPortTemplate
> > > -#    struct :forwarding_group_template, :class =>
> > > CIMI::Model::ForwardingGroupTemplate
> > > -#    struct :address_template, :class =>
> CIMI::Model::AddressTemplate
> > > +    ref :machine_template, :class => CIMI::Model::MachineTemplate
> > > +#TODO: add the rest
> > > +#    ref :system_template, :class => CIMI::Model::SystemTemplate
> > > +#    ref :credential_template, :class =>
> > > CIMI::Model::CredentialTemplate
> > > +#    ref :volume_template, :class => CIMI::Model::VolumeTemplate
> > > +#    ref :network_template, :class =>
CIMI::Model::NetworkTemplate
> > > +#    ref :network_port_template, :class =>
> > > CIMI::Model::NetworkPortTemplate
> > > +#    ref :forwarding_group_template, :class =>
> > > CIMI::Model::ForwardingGroupTemplate
> > > +#    ref :address_template, :class =>
CIMI::Model::AddressTemplate
> > >      text :quantity
> > >    end
> > >
> > > diff --git a/server/lib/deltacloud/drivers/fgcp/fgcp_client.rb
> > > b/server/lib/deltacloud/drivers/fgcp/fgcp_client.rb
> > > index fed3b70..9597c13 100644
> > > --- a/server/lib/deltacloud/drivers/fgcp/fgcp_client.rb
> > > +++ b/server/lib/deltacloud/drivers/fgcp/fgcp_client.rb
> > > @@ -94,6 +94,10 @@ class FgcpClient
> > >      request('ListVSYSDescriptor')
> > >    end
> > >
> > > +  def get_vsys_descriptor_configuration(vsys_descriptor_id)
> > > +    request('GetVSYSDescriptorConfiguration', {'vsysDescriptorId'
> =>
> > > vsys_descriptor_id})
> > > +  end
> > > +
> > >    def list_vservers(vsys_id)
> > >      request('ListVServer', {'vsysId' => vsys_id})
> > >    end
> > > diff --git
> > > a/server/lib/deltacloud/drivers/fgcp/fgcp_driver_cimi_methods.rb
> > > b/server/lib/deltacloud/drivers/fgcp/fgcp_driver_cimi_methods.rb
> > > index b4d31f6..9f94ad5 100644
> > > ---
> a/server/lib/deltacloud/drivers/fgcp/fgcp_driver_cimi_methods.rb
> > > +++
> b/server/lib/deltacloud/drivers/fgcp/fgcp_driver_cimi_methods.rb
> > > @@ -57,11 +57,41 @@ module Deltacloud::Drivers::Fgcp
> > >      def system_templates(credentials, opts={})
> > >        safely do
> > >          client = new_client(credentials)
> > > +        context = opts[:env]
> > >          templates =
> > >
> client.list_vsys_descriptor['vsysdescriptors'][0]['vsysdescriptor'].
> > > collect do |desc|
> > > +          conf =
> > >
> client.get_vsys_descriptor_configuration(desc['vsysdescriptorId'][0]
> > > )['vsysdescriptor'][0]
> > > +          components = conf['vservers'][0]['vserver'].collect do
> > > |vserver|
> > > +            next if vserver['vserverType'][0] == 'firewall'
> > > +            volume_templates =
> vserver['vdisks'][0]['vdisk'].collect
> > > do |vdisk|
> > > +              {
> > > +                :volume_config => {:capacity =>
> > > "#{vdisk['size'][0].to_i}"}
> > > +              }
> > > +#
> > > {:href=>context.volume_url(snapshot.storage_volume_id)},
> > > +#              {
> > > +#                :volume_template => "#{vdisk['size'][0].to_i}"
> > > +#              }
> > > +#              CIMI::Model::VolumeTemplate.new(
> > > +#                :volume_config =>
> > > CIMI::Model::VolumeConfiguration.new(:capacity =>
> > > vdisk['size'][0].to_i)
> > > +#              )
> > > +            end if vserver['vdisks']
> > > +            puts "volume_templates: #{volume_templates}"
> > > +            {
> > > +              :name             => desc['vsysdescriptorName'][0],
> > > +              :description      => desc['description'][0],
> > > +              :type             =>
> > > "http://schemas.dmtf.org/cimi/1/Machine",
> > > +              :machine_template =>
> CIMI::Model::MachineTemplate.new(
> > > +                :name             => vserver['vserverName'][0],
> > > +                :machine_config   =>
> > > CIMI::Model::MachineConfiguration.find(vserver['vserverType'][0],
> > > context),
> > > +                :machine_image    => { :href =>
> > > context.machine_image_url(vserver['diskimageId'][0]) },
> > > +                :volume_templates => volume_templates
> > > +              )
> > > +            }
> > > +          end
> > >            CIMI::Model::SystemTemplate.new(
> > > -            :id           => desc['vsysdescriptorId'][0],
> > > -            :name         => desc['vsysdescriptorName'][0],
> > > -            :description  => desc['description'][0]
> > > +            :id                    =>
> desc['vsysdescriptorId'][0],
> > > +            :name                  =>
> desc['vsysdescriptorName'][0],
> > > +            :description           => desc['description'][0],
> > > +            :component_descriptors => components.compact
> > >            )
> > >          end
> > >          templates = templates.select { |t| opts[:id] == t[:id] }
> if
> > > opts[:id]
> > > 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
> > > index 495fc24..c8c095b 100644
> > > ---
> > >
> 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
> > > @@ -4,21 +4,32 @@
> > >    "created": "Fri Feb 08 12:15:15 EET 2013",
> > >    "componentDescriptors": [
> > >      { "name": "my machine",
> > > -      "type": "http://schemas.dmtf.org/cimi/1/Machine",
> > >        "description": "an inline mock machine template",
> > > +      "type": "http://schemas.dmtf.org/cimi/1/Machine",
> > >        "machineTemplate": {
> > >          "name": "machine in mock system",
> > >          "description": "machine in system",
> > >          "machineConfig": { "href":
> > > "http://example.com/configs/m1-small" },
> > > -        "machineImage": { "href":
> "http://example.com/images/img1" }
> > > +        "machineImage": { "href":
> "http://example.com/images/img1" },
> > > +        "volumeTemplates": [
> > > +	  { "href": "http://example.com/volumes/sysvol1" }
> > > +	]
> > >        }
> > >      },
> > > -    { "name": "my network",
> > > -      "type": "http://schemas.dmtf.org/cimi/1/Network",
> > > -      "description": "a reference to an existing mock network
> > template",
> > > -      "networkTemplate": {
> > > -        "href":
> > > "http://cimi.example.org/network_templates/template1"
> > > +    { "name": "my second machine",
> > > +      "description": "another inline mock machine template",
> > > +      "type": "http://schemas.dmtf.org/cimi/1/Machine",
> > > +      "machineTemplate": {
> > > +        "name": "machine in mock system",
> > > +        "description": "machine in system",
> > > +        "machineConfig": { "href":
> > > "http://example.com/configs/m1-small" },
> > > +        "machineImage": { "href":
> "http://example.com/images/img1" }
> > >        }
> > > +    },
> > > +    { "name": "my third machine",
> > > +      "description": "a reference to a mock machine template",
> > > +      "type": "http://schemas.dmtf.org/cimi/1/Machine",
> > > +      "machineTemplate": { "href" :
> > > "http://example.com/machine_templates/template1" }
> > >      }
> > >    ],
> > >    "operations": [
> > > 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 b1c57c8..13987f2 100644
> > > ---
> a/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
> > > +++
> b/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
> > > @@ -35,6 +35,38 @@ module Deltacloud::Drivers::Mock
> > >        systems.map{|sys|convert_cimi_mock_urls(:system,
> > > sys ,opts[:env])}.flatten
> > >      end
> > >
> > > +    def create_system(credentials, opts={})
> > > +      check_credentials(credentials)
> > > +      id = "#{opts[:env].send("systems_url")}/#{opts[:name]}"
> > > +      sys_hsh = { "id"=> id,
> > > +                  "name" => opts[:name],
> > > +                  "description" => opts[:description],
> > > +                  "created" => Time.now,
> > > +                  "state" => "STOPPED",
> > > +                  "systemTemplate"=> { "href" =>
> > > opts[:system_template].id },
> > > +                  "operations" => [{"rel"=>"edit", "href"=> id},
> > > +                                   {"rel"=>"delete", "href"=>
> > > id}]    }
> > > +      system =
> CIMI::Model::System.from_json(JSON.generate(sys_hsh))
> > > +
> > > +      @client.store_cimi(:system, system)
> > > +      system
> > > +    end
> > > +
> > > +    def delete_system(credentials, id)
> > > +      check_credentials(credentials)
> > > +      @client.destroy_cimi(:system, id)
> > > +    end
> > > +
> > > +    def start_system(credentials, id)
> > > +      check_credentials(credentials)
> > > +      update_object_state(id, "System", "STARTED")
> > > +    end
> > > +
> > > +    def stop_system(credentials, id)
> > > +      check_credentials(credentials)
> > > +      update_object_state(id, "System", "STOPPED")
> > > +    end
> > > +
> > >      def system_templates(credentials, opts={})
> > >        check_credentials(credentials)
> > >        if opts[:id].nil?
> > > --
> > > 1.8.0.msysgit.0
> > >
> > >
> >
> >
> 
> --
> Michal Fojtik <mfojtik@redhat.com>
> Deltacloud API, CloudForms



Mime
View raw message