From: Martyn Taylor <mtaylor(a)redhat.com>
This will help separate the warehouse and factory models
---
lib/aeolus_image.rb | 21 +--
lib/aeolus_image/model/image.rb | 91 ----------
lib/aeolus_image/model/image_build.rb | 68 --------
lib/aeolus_image/model/provider_image.rb | 46 -----
lib/aeolus_image/model/target_image.rb | 56 ------
lib/aeolus_image/model/template.rb | 29 ---
lib/aeolus_image/model/warehouse/image.rb | 93 ++++++++++
lib/aeolus_image/model/warehouse/image_build.rb | 70 ++++++++
lib/aeolus_image/model/warehouse/provider_image.rb | 48 +++++
lib/aeolus_image/model/warehouse/target_image.rb | 58 +++++++
lib/aeolus_image/model/warehouse/template.rb | 31 ++++
.../model/warehouse/warehouse_client.rb | 178 +++++++++++++++++++
.../model/warehouse/warehouse_model.rb | 162 ++++++++++++++++++
lib/aeolus_image/model/warehouse_client.rb | 180 --------------------
lib/aeolus_image/model/warehouse_model.rb | 162 ------------------
15 files changed, 647 insertions(+), 646 deletions(-)
delete mode 100644 lib/aeolus_image/model/image.rb
delete mode 100644 lib/aeolus_image/model/image_build.rb
delete mode 100644 lib/aeolus_image/model/provider_image.rb
delete mode 100644 lib/aeolus_image/model/target_image.rb
delete mode 100644 lib/aeolus_image/model/template.rb
create mode 100644 lib/aeolus_image/model/warehouse/image.rb
create mode 100644 lib/aeolus_image/model/warehouse/image_build.rb
create mode 100644 lib/aeolus_image/model/warehouse/provider_image.rb
create mode 100644 lib/aeolus_image/model/warehouse/target_image.rb
create mode 100644 lib/aeolus_image/model/warehouse/template.rb
create mode 100644 lib/aeolus_image/model/warehouse/warehouse_client.rb
create mode 100644 lib/aeolus_image/model/warehouse/warehouse_model.rb
delete mode 100644 lib/aeolus_image/model/warehouse_client.rb
delete mode 100644 lib/aeolus_image/model/warehouse_model.rb
diff --git a/lib/aeolus_image.rb b/lib/aeolus_image.rb
index f17ed66..ce23933 100644
--- a/lib/aeolus_image.rb
+++ b/lib/aeolus_image.rb
@@ -14,17 +14,10 @@
require 'optparse'
require 'logger'
-require File.join(File.dirname(__FILE__), 'aeolus_image/command',
'base_command')
-require File.join(File.dirname(__FILE__), 'aeolus_image/command',
'list_command')
-require File.join(File.dirname(__FILE__), 'aeolus_image/command',
'build_command')
-require File.join(File.dirname(__FILE__), 'aeolus_image/command',
'push_command')
-require File.join(File.dirname(__FILE__), 'aeolus_image/command',
'import_command')
-require File.join(File.dirname(__FILE__), 'aeolus_image/command',
'delete_command')
-require File.join(File.dirname(__FILE__), 'aeolus_image/command',
'config_parser')
-require File.join(File.dirname(__FILE__), 'aeolus_image/model',
'warehouse_client') # Not sure we need this
-require File.join(File.dirname(__FILE__), 'aeolus_image/model',
'warehouse_model') # We may be able to factor this out?
-require File.join(File.dirname(__FILE__), 'aeolus_image/model',
'image')
-require File.join(File.dirname(__FILE__), 'aeolus_image/model',
'image_build')
-require File.join(File.dirname(__FILE__), 'aeolus_image/model',
'provider_image')
-require File.join(File.dirname(__FILE__), 'aeolus_image/model',
'target_image')
-require File.join(File.dirname(__FILE__), 'aeolus_image/model',
'template')
+require File.join(File.dirname(__FILE__), 'aeolus_image/model/warehouse',
'warehouse_client') # Not sure we need this
+require File.join(File.dirname(__FILE__), 'aeolus_image/model/warehouse',
'warehouse_model') # We may be able to factor this out?
+require File.join(File.dirname(__FILE__), 'aeolus_image/model/warehouse',
'image')
+require File.join(File.dirname(__FILE__), 'aeolus_image/model/warehouse',
'image_build')
+require File.join(File.dirname(__FILE__), 'aeolus_image/model/warehouse',
'provider_image')
+require File.join(File.dirname(__FILE__), 'aeolus_image/model/warehouse',
'target_image')
+require File.join(File.dirname(__FILE__), 'aeolus_image/model/warehouse',
'template')
diff --git a/lib/aeolus_image/model/image.rb b/lib/aeolus_image/model/image.rb
deleted file mode 100644
index 73b004e..0000000
--- a/lib/aeolus_image/model/image.rb
+++ /dev/null
@@ -1,91 +0,0 @@
-# Copyright 2011 Red Hat, Inc.
-#
-# Licensed 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 Aeolus
- module Image
- class Image < WarehouseModel
- OS = Struct.new(:name, :version, :arch)
-
- @bucket_name = 'images'
-
- def initialize(attrs)
- attrs.each do |k,v|
- if k.to_sym == :latest_build
- sym = :attr_writer
- else
- sym = :attr_accessor
- end
- self.class.send(sym, k.to_sym) unless respond_to?(:"#{k}=")
- send(:"#{k}=", v)
- end
- @xml_body = Nokogiri::XML @body
- end
-
- def template_xml
- unless @template_xml
- begin
- @template_xml = Nokogiri::XML
image_builds.first.target_images.first.target_template.body
- rescue
- @template_xml = Nokogiri::XML "<template></template>"
- end
- end
- @template_xml
- end
-
- def latest_pushed_build
- ImageBuild.find(@latest_build) if @latest_build
- end
-
- def image_builds
- ImageBuild.find_all_by_image_uuid(@uuid)
- end
-
- #TODO: We should get the image fields from the object body once we have it
defined.
- def name
- unless @name
- @name = @xml_body.xpath("/image/name").text
- if @name.empty?
- @name = template_xml.xpath("/template/name").text
- end
- end
- @name
- end
-
- def os
- unless @os
- @os = OS.new(template_xml.xpath("/template/os/name").text,
template_xml.xpath("/template/os/version").text,
template_xml.xpath("/template/os/arch").text)
- end
- @os
- end
-
- def description
- unless @description
- @description = template_xml.xpath("/template/description").text
- end
- @description
- end
-
- # Delete this image and all child objects
- def delete!
- begin
- image_builds.each do |build|
- build.delete!
- end
- rescue NoMethodError
- end
- Image.delete(@uuid)
- end
- end
- end
-end
diff --git a/lib/aeolus_image/model/image_build.rb
b/lib/aeolus_image/model/image_build.rb
deleted file mode 100644
index b751117..0000000
--- a/lib/aeolus_image/model/image_build.rb
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2011 Red Hat, Inc.
-#
-# Licensed 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 Aeolus
- module Image
- class ImageBuild < WarehouseModel
- @bucket_name = 'builds'
-
- def initialize(attrs)
- attrs.each do |k,v|
- if k.to_sym == :image
- sym = :attr_writer
- else
- sym = :attr_accessor
- end
- self.class.send(sym, k.to_sym) unless respond_to?(:"#{k}=")
- send(:"#{k}=", v)
- end
- end
-
- def self.find_all_by_image_uuid(uuid)
- self.set_warehouse_and_bucket if self.bucket.nil?
- self.bucket.objects.map do |wh_object|
- if wh_object.attr('image') == uuid
- ImageBuild.new(wh_object.attrs(wh_object.attr_list))
- end
- end.compact
- end
-
- def image
- Image.find(@image) if @image
- end
-
- def target_images
- TargetImage.all.select {|ti| ti.build and (ti.build.uuid == self.uuid)}
- end
-
- def provider_images
- targets = target_images
- ProviderImage.all.select do |pi|
- targets.include?(pi.target_image)
- end
- end
-
- # Deletes this image and all child objects
- def delete!
- begin
- target_images.each do |ti|
- ti.delete!
- end
- rescue NoMethodError
- end
- ImageBuild.delete(@uuid)
- end
- end
- end
-end
diff --git a/lib/aeolus_image/model/provider_image.rb
b/lib/aeolus_image/model/provider_image.rb
deleted file mode 100644
index a5f319d..0000000
--- a/lib/aeolus_image/model/provider_image.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2011 Red Hat, Inc.
-#
-# Licensed 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 Aeolus
- module Image
- class ProviderImage < WarehouseModel
- @bucket_name = 'provider_images'
-
- def initialize(attrs)
- attrs.each do |k,v|
- if [:provider, :target_image].include?(k.to_sym)
- sym = :attr_writer
- else
- sym = :attr_accessor
- end
- self.class.send(sym, k.to_sym) unless respond_to?(:"#{k}=")
- send(:"#{k}=", v)
- end
- end
-
- def target_image
- TargetImage.find(@target_image) if @target_image
- end
-
- def provider_name
- @provider
- end
-
- # Deletes this provider image
- def delete!
- ProviderImage.delete(@uuid)
- end
- end
- end
-end
diff --git a/lib/aeolus_image/model/target_image.rb
b/lib/aeolus_image/model/target_image.rb
deleted file mode 100644
index c029430..0000000
--- a/lib/aeolus_image/model/target_image.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2011 Red Hat, Inc.
-#
-# Licensed 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 Aeolus
- module Image
- class TargetImage < WarehouseModel
- @bucket_name = 'target_images'
-
- def initialize(attrs)
- attrs.each do |k,v|
- if k.to_sym == :build
- sym = :attr_writer
- else
- sym = :attr_accessor
- end
- self.class.send(sym, k.to_sym) unless respond_to?(:"#{k}=")
- send(:"#{k}=", v)
- end
- end
-
- def build
- ImageBuild.find(@build) if @build
- end
-
- def provider_images
- ProviderImage.all.select{|pi| pi.target_image and (pi.target_image.uuid ==
self.uuid)}
- end
-
- def target_template
- Template.find(@template) if @template
- end
-
- # Deletes this targetimage and all child objects
- def delete!
- begin
- provider_images.each do |pi|
- pi.delete!
- end
- rescue NoMethodError
- end
- TargetImage.delete(@uuid)
- end
- end
- end
-end
diff --git a/lib/aeolus_image/model/template.rb b/lib/aeolus_image/model/template.rb
deleted file mode 100644
index e1ac3cb..0000000
--- a/lib/aeolus_image/model/template.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2011 Red Hat, Inc.
-#
-# Licensed 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 Aeolus
- module Image
- class Template < WarehouseModel
- @bucket_name = 'templates'
-
- def initialize(attrs)
- attrs.each do |k,v|
- sym = :attr_accessor
- self.class.send(sym, k.to_sym) unless respond_to?(:"#{k}=")
- send(:"#{k}=", v)
- end
- end
- end
- end
-end
diff --git a/lib/aeolus_image/model/warehouse/image.rb
b/lib/aeolus_image/model/warehouse/image.rb
new file mode 100644
index 0000000..7a7a4f3
--- /dev/null
+++ b/lib/aeolus_image/model/warehouse/image.rb
@@ -0,0 +1,93 @@
+# Copyright 2011 Red Hat, Inc.
+#
+# Licensed 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 Aeolus
+ module Image
+ module Warehouse
+ class Image < WarehouseModel
+ OS = Struct.new(:name, :version, :arch)
+
+ @bucket_name = 'images'
+
+ def initialize(attrs)
+ attrs.each do |k,v|
+ if k.to_sym == :latest_build
+ sym = :attr_writer
+ else
+ sym = :attr_accessor
+ end
+ self.class.send(sym, k.to_sym) unless respond_to?(:"#{k}=")
+ send(:"#{k}=", v)
+ end
+ @xml_body = Nokogiri::XML @body
+ end
+
+ def template_xml
+ unless @template_xml
+ begin
+ @template_xml = Nokogiri::XML
image_builds.first.target_images.first.target_template.body
+ rescue
+ @template_xml = Nokogiri::XML
"<template></template>"
+ end
+ end
+ @template_xml
+ end
+
+ def latest_pushed_build
+ ImageBuild.find(@latest_build) if @latest_build
+ end
+
+ def image_builds
+ ImageBuild.find_all_by_image_uuid(@uuid)
+ end
+
+ #TODO: We should get the image fields from the object body once we have it
defined.
+ def name
+ unless @name
+ @name = @xml_body.xpath("/image/name").text
+ if @name.empty?
+ @name = template_xml.xpath("/template/name").text
+ end
+ end
+ @name
+ end
+
+ def os
+ unless @os
+ @os = OS.new(template_xml.xpath("/template/os/name").text,
template_xml.xpath("/template/os/version").text,
template_xml.xpath("/template/os/arch").text)
+ end
+ @os
+ end
+
+ def description
+ unless @description
+ @description = template_xml.xpath("/template/description").text
+ end
+ @description
+ end
+
+ # Delete this image and all child objects
+ def delete!
+ begin
+ image_builds.each do |build|
+ build.delete!
+ end
+ rescue NoMethodError
+ end
+ Image.delete(@uuid)
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/aeolus_image/model/warehouse/image_build.rb
b/lib/aeolus_image/model/warehouse/image_build.rb
new file mode 100644
index 0000000..d99069d
--- /dev/null
+++ b/lib/aeolus_image/model/warehouse/image_build.rb
@@ -0,0 +1,70 @@
+# Copyright 2011 Red Hat, Inc.
+#
+# Licensed 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 Aeolus
+ module Image
+ module Warehouse
+ class ImageBuild < WarehouseModel
+ @bucket_name = 'builds'
+
+ def initialize(attrs)
+ attrs.each do |k,v|
+ if k.to_sym == :image
+ sym = :attr_writer
+ else
+ sym = :attr_accessor
+ end
+ self.class.send(sym, k.to_sym) unless respond_to?(:"#{k}=")
+ send(:"#{k}=", v)
+ end
+ end
+
+ def self.find_all_by_image_uuid(uuid)
+ self.set_warehouse_and_bucket if self.bucket.nil?
+ self.bucket.objects.map do |wh_object|
+ if wh_object.attr('image') == uuid
+ ImageBuild.new(wh_object.attrs(wh_object.attr_list))
+ end
+ end.compact
+ end
+
+ def image
+ Image.find(@image) if @image
+ end
+
+ def target_images
+ TargetImage.all.select {|ti| ti.build and (ti.build.uuid == self.uuid)}
+ end
+
+ def provider_images
+ targets = target_images
+ ProviderImage.all.select do |pi|
+ targets.include?(pi.target_image)
+ end
+ end
+
+ # Deletes this image and all child objects
+ def delete!
+ begin
+ target_images.each do |ti|
+ ti.delete!
+ end
+ rescue NoMethodError
+ end
+ ImageBuild.delete(@uuid)
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/aeolus_image/model/warehouse/provider_image.rb
b/lib/aeolus_image/model/warehouse/provider_image.rb
new file mode 100644
index 0000000..acd0386
--- /dev/null
+++ b/lib/aeolus_image/model/warehouse/provider_image.rb
@@ -0,0 +1,48 @@
+# Copyright 2011 Red Hat, Inc.
+#
+# Licensed 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 Aeolus
+ module Image
+ module Warehouse
+ class ProviderImage < WarehouseModel
+ @bucket_name = 'provider_images'
+
+ def initialize(attrs)
+ attrs.each do |k,v|
+ if [:provider, :target_image].include?(k.to_sym)
+ sym = :attr_writer
+ else
+ sym = :attr_accessor
+ end
+ self.class.send(sym, k.to_sym) unless respond_to?(:"#{k}=")
+ send(:"#{k}=", v)
+ end
+ end
+
+ def target_image
+ TargetImage.find(@target_image) if @target_image
+ end
+
+ def provider_name
+ @provider
+ end
+
+ # Deletes this provider image
+ def delete!
+ ProviderImage.delete(@uuid)
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/aeolus_image/model/warehouse/target_image.rb
b/lib/aeolus_image/model/warehouse/target_image.rb
new file mode 100644
index 0000000..8636694
--- /dev/null
+++ b/lib/aeolus_image/model/warehouse/target_image.rb
@@ -0,0 +1,58 @@
+# Copyright 2011 Red Hat, Inc.
+#
+# Licensed 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 Aeolus
+ module Image
+ module Warehouse
+ class TargetImage < WarehouseModel
+ @bucket_name = 'target_images'
+
+ def initialize(attrs)
+ attrs.each do |k,v|
+ if k.to_sym == :build
+ sym = :attr_writer
+ else
+ sym = :attr_accessor
+ end
+ self.class.send(sym, k.to_sym) unless respond_to?(:"#{k}=")
+ send(:"#{k}=", v)
+ end
+ end
+
+ def build
+ ImageBuild.find(@build) if @build
+ end
+
+ def provider_images
+ ProviderImage.all.select{|pi| pi.target_image and (pi.target_image.uuid ==
self.uuid)}
+ end
+
+ def target_template
+ Template.find(@template) if @template
+ end
+
+ # Deletes this targetimage and all child objects
+ def delete!
+ begin
+ provider_images.each do |pi|
+ pi.delete!
+ end
+ rescue NoMethodError
+ end
+ TargetImage.delete(@uuid)
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/aeolus_image/model/warehouse/template.rb
b/lib/aeolus_image/model/warehouse/template.rb
new file mode 100644
index 0000000..a3b9ec5
--- /dev/null
+++ b/lib/aeolus_image/model/warehouse/template.rb
@@ -0,0 +1,31 @@
+# Copyright 2011 Red Hat, Inc.
+#
+# Licensed 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 Aeolus
+ module Image
+ module Warehouse
+ class Template < WarehouseModel
+ @bucket_name = 'templates'
+
+ def initialize(attrs)
+ attrs.each do |k,v|
+ sym = :attr_accessor
+ self.class.send(sym, k.to_sym) unless respond_to?(:"#{k}=")
+ send(:"#{k}=", v)
+ end
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/aeolus_image/model/warehouse/warehouse_client.rb
b/lib/aeolus_image/model/warehouse/warehouse_client.rb
new file mode 100644
index 0000000..4df83a1
--- /dev/null
+++ b/lib/aeolus_image/model/warehouse/warehouse_client.rb
@@ -0,0 +1,178 @@
+# Copyright 2011 Red Hat, Inc.
+#
+# Licensed 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 'rubygems'
+
+require 'rest-client'
+require 'nokogiri'
+
+#TODO: perform iwhd version-dependent URI mapping
+module Aeolus
+ module Image
+ module Warehouse
+ class BucketObject
+ attr_reader :key
+
+ def initialize(connection, key, bucket)
+ @connection = connection
+ @key = key
+ @bucket = bucket
+ @path = "/#{@bucket.name}/#{(a)key}"
+ end
+
+ def self.create(connection, key, bucket, body, attrs = {})
+ obj = new(connection, key, bucket)
+ obj.set_body(body)
+ obj.set_attrs(attrs)
+ obj
+ end
+
+ def body
+ @connection.do_request @path, :plain => true
+ end
+
+ def set_body(body)
+ @connection.do_request @path, :content => body, :method => :put
+ end
+
+ def attr_list
+ result = @connection.do_request @path, :content => 'op=parts',
:method => :post
+ return result.xpath('/object/object_attr/(a)name').to_a.map {|item|
item.value}
+ end
+
+ def attrs(list)
+ attrs = {}
+ list.each do |att|
+ next if att.match('-')
+ attrs[att] = (@connection.do_request("#{@path}/#{att}", :plain
=> true) rescue nil)
+ end
+ attrs[:body] = body
+ attrs
+ end
+
+ def attr(name)
+ attrs([name])[name]
+ end
+
+ def set_attrs(hash)
+ hash.each do |name, content|
+ set_attr(name, content)
+ end
+ end
+
+ def set_attr(name, content)
+ path = "#{@path}/#{name}"
+ @connection.do_request path, :content => content, :method => :put
+ end
+
+ def delete!
+ @connection.do_request @path, :method => :delete
+ true
+ end
+
+ end
+
+ class Bucket
+ attr_accessor :name
+
+ def initialize(name, connection)
+ @name = name
+ @connection = connection
+ end
+
+ def to_s
+ "Bucket: #{@name}"
+ end
+
+ def object_names
+ result = @connection.do_request "/#{@name}"
+ result.xpath('/objects/object').map do |obj|
+ obj.at_xpath('./key/text()').to_s
+ end
+ end
+
+ def objects
+ object_names.map do |name|
+ object(name)
+ end
+ end
+
+ def object(key)
+ BucketObject.new @connection, key, self
+ end
+
+ def create_object(key, body, attrs)
+ BucketObject.create(@connection, key, self, body, attrs)
+ end
+
+ def include?(key)
+ object_names.include?(key)
+ end
+ end
+
+ class Connection
+ attr_accessor :uri
+
+ def initialize(uri)
+ @uri = uri
+ end
+
+ def do_request(path = '', opts={})
+ opts[:method] ||= :get
+ opts[:content] ||= ''
+ opts[:plain] ||= false
+ opts[:headers] ||= {}
+
+ result = RestClient::Request.execute :method => opts[:method], :url =>
@uri + path, :payload => opts[:content], :headers => opts[:headers]
+
+ return Nokogiri::XML result unless opts[:plain]
+ return result
+ end
+
+ end
+
+ class Client
+
+ def initialize(uri)
+ @connection = Connection.new(uri)
+ end
+
+ def create_bucket(bucket)
+ @connection.do_request "/#{bucket}", :method => :put rescue
RestClient::InternalServerError
+ Bucket.new(bucket, @connection)
+ end
+
+ def bucket(bucket)
+ Bucket.new bucket, @connection
+ end
+
+ def buckets
+ @connection.do_request.xpath('/api/link[(a)rel="bucket"]').map
do |obj|
+ obj.at_xpath('./(a)href').to_s.gsub(/.*\//, '')
+ end
+ end
+
+ def get_iwhd_version
+ result =
@connection.do_request.at_xpath('/api[@service="image_warehouse"]/@version')
+ raise "Response does not contain <api> tag or version
information" if result == nil
+ return result.value
+ end
+
+ def query(bucket_name, query_string)
+ @connection.do_request "/#{bucket_name}/_query", {:method =>
:post, :content => query_string}
+ end
+ end
+ end
+ end
+end
diff --git a/lib/aeolus_image/model/warehouse/warehouse_model.rb
b/lib/aeolus_image/model/warehouse/warehouse_model.rb
new file mode 100644
index 0000000..2631c5b
--- /dev/null
+++ b/lib/aeolus_image/model/warehouse/warehouse_model.rb
@@ -0,0 +1,162 @@
+# Copyright 2011 Red Hat, Inc.
+#
+# Licensed 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 Aeolus
+ module Image
+ module Warehouse
+ class BucketObjectNotFound < Exception;end
+ class BucketNotFound < Exception;end
+
+ class WarehouseModel
+
+ def ==(other_obj)
+ # If the objects have different instance variables defined, they're
definitely not ==
+ return false unless instance_variables.sort ==
other_obj.instance_variables.sort
+ # Otherwise, ensure that they're all the same
+ instance_variables.each do |iv|
+ return false unless other_obj.instance_variable_get(iv) ==
instance_variable_get(iv)
+ end
+ # They have the same instance variables and values, so they're equal
+ true
+ end
+
+ class << self
+ attr_accessor :warehouse, :bucket, :bucket_name
+
+ def set_warehouse_and_bucket
+ begin
+ @@config ||= load_config
+ self.warehouse = Warehouse::Client.new(@@config[:iwhd][:url])
+ self.bucket = self.warehouse.bucket(@bucket_name)
+ rescue
+ raise BucketNotFound
+ end
+ end
+
+ def bucket_objects
+ self.set_warehouse_and_bucket if self.bucket.nil?
+
+ begin
+ self.bucket.objects
+ rescue RestClient::ResourceNotFound
+ []
+ end
+ end
+
+ def first
+ obj = bucket_objects.first
+ obj ? self.new(obj.attrs(obj.attr_list)) : nil
+ end
+
+ def last
+ obj = bucket_objects.last
+ obj ? self.new(obj.attrs(obj.attr_list)) : nil
+ end
+
+ def all
+ bucket_objects.map do |wh_object|
+ self.new(wh_object.attrs(wh_object.attr_list))
+ end
+ end
+
+ def find(uuid)
+ self.set_warehouse_and_bucket if self.bucket.nil?
+ begin
+ if self.bucket.include?(uuid)
+
self.new(self.bucket.object(uuid).attrs(self.bucket.object(uuid).attr_list))
+ else
+ nil
+ end
+ rescue RestClient::ResourceNotFound
+ nil
+ end
+ end
+
+ def where(query_string)
+ self.set_warehouse_and_bucket if self.bucket.nil?
+ self.warehouse.query(@bucket_name, query_string)
+ end
+
+ def delete(uuid)
+ self.set_warehouse_and_bucket if self.bucket.nil?
+ begin
+ if self.bucket.include?(uuid)
+ self.bucket.object(uuid).delete!
+ else
+ false
+ end
+ rescue RestClient::ResourceNotFound
+ false
+ end
+ end
+
+ protected
+ # Copy over entirely too much code to load the config file
+ def load_config
+ # TODO - Is this always the case? We should probably have /etc/aeolus-cli or
something too?
+ # Or allow Rails to override this
+ @config_location ||= "~/.aeolus-cli"
+ begin
+ file_str = read_file(@config_location)
+ if is_file?(@config_location) &&
!file_str.include?(":url")
+ lines = File.readlines(File.expand_path((a)config_location)).map do
|line|
+ "#" + line
+ end
+ File.open(File.expand_path(@config_location), 'w') do |file|
+ file.puts lines
+ end
+ write_file
+ end
+ write_file unless is_file?(@config_location)
+ YAML::load(File.open(File.expand_path(@config_location)))
+ rescue Errno::ENOENT
+ #TODO: Create a custom exception to wrap CLI Exceptions
+ raise "Unable to locate or write configuration file: \"" +
@config_location + "\""
+ end
+ end
+
+ def write_file
+ example = File.read(File.expand_path(File.dirname(__FILE__) +
"/../../examples/aeolus-cli"))
+ File.open(File.expand_path(@config_location), 'a+') do |f|
+ f.write(example)
+ end
+ end
+
+ def read_file(path)
+ begin
+ full_path = File.expand_path(path)
+ if is_file?(path)
+ File.read(full_path)
+ else
+ return nil
+ end
+ rescue
+ nil
+ end
+ end
+
+ def is_file?(path)
+ full_path = File.expand_path(path)
+ if File.exist?(full_path) && !File.directory?(full_path)
+ return true
+ end
+ false
+ end
+
+ end
+
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/aeolus_image/model/warehouse_client.rb
b/lib/aeolus_image/model/warehouse_client.rb
deleted file mode 100644
index f0da7ff..0000000
--- a/lib/aeolus_image/model/warehouse_client.rb
+++ /dev/null
@@ -1,180 +0,0 @@
-# Copyright 2011 Red Hat, Inc.
-#
-# Licensed 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 'rubygems'
-
-require 'rest-client'
-require 'nokogiri'
-
-#TODO: perform iwhd version-dependent URI mapping
-module Aeolus
- module Image
- module Warehouse
-
- class BucketObject
- attr_reader :key
-
- def initialize(connection, key, bucket)
- @connection = connection
- @key = key
- @bucket = bucket
- @path = "/#{@bucket.name}/#{(a)key}"
- end
-
- def self.create(connection, key, bucket, body, attrs = {})
- obj = new(connection, key, bucket)
- obj.set_body(body)
- obj.set_attrs(attrs)
- obj
- end
-
- def body
- @connection.do_request @path, :plain => true
- end
-
- def set_body(body)
- @connection.do_request @path, :content => body, :method => :put
- end
-
- def attr_list
- result = @connection.do_request @path, :content => 'op=parts',
:method => :post
- return result.xpath('/object/object_attr/(a)name').to_a.map {|item|
item.value}
- end
-
- def attrs(list)
- attrs = {}
- list.each do |att|
- next if att.match('-')
- attrs[att] = (@connection.do_request("#{@path}/#{att}", :plain
=> true) rescue nil)
- end
- attrs[:body] = body
- attrs
- end
-
- def attr(name)
- attrs([name])[name]
- end
-
- def set_attrs(hash)
- hash.each do |name, content|
- set_attr(name, content)
- end
- end
-
- def set_attr(name, content)
- path = "#{@path}/#{name}"
- @connection.do_request path, :content => content, :method => :put
- end
-
- def delete!
- @connection.do_request @path, :method => :delete
- true
- end
-
- end
-
- class Bucket
- attr_accessor :name
-
- def initialize(name, connection)
- @name = name
- @connection = connection
- end
-
- def to_s
- "Bucket: #{@name}"
- end
-
- def object_names
- result = @connection.do_request "/#{@name}"
- result.xpath('/objects/object').map do |obj|
- obj.at_xpath('./key/text()').to_s
- end
- end
-
- def objects
- object_names.map do |name|
- object(name)
- end
- end
-
- def object(key)
- BucketObject.new @connection, key, self
- end
-
- def create_object(key, body, attrs)
- BucketObject.create(@connection, key, self, body, attrs)
- end
-
- def include?(key)
- object_names.include?(key)
- end
- end
-
- class Connection
- attr_accessor :uri
-
- def initialize(uri)
- @uri = uri
- end
-
- def do_request(path = '', opts={})
- opts[:method] ||= :get
- opts[:content] ||= ''
- opts[:plain] ||= false
- opts[:headers] ||= {}
-
- result = RestClient::Request.execute :method => opts[:method], :url =>
@uri + path, :payload => opts[:content], :headers => opts[:headers]
-
- return Nokogiri::XML result unless opts[:plain]
- return result
- end
-
- end
-
- class Client
-
- def initialize(uri)
- @connection = Connection.new(uri)
- end
-
- def create_bucket(bucket)
- @connection.do_request "/#{bucket}", :method => :put rescue
RestClient::InternalServerError
- Bucket.new(bucket, @connection)
- end
-
- def bucket(bucket)
- Bucket.new bucket, @connection
- end
-
- def buckets
- @connection.do_request.xpath('/api/link[(a)rel="bucket"]').map
do |obj|
- obj.at_xpath('./(a)href').to_s.gsub(/.*\//, '')
- end
- end
-
- def get_iwhd_version
- result =
@connection.do_request.at_xpath('/api[@service="image_warehouse"]/@version')
- raise "Response does not contain <api> tag or version
information" if result == nil
- return result.value
- end
-
- def query(bucket_name, query_string)
- @connection.do_request "/#{bucket_name}/_query", {:method =>
:post, :content => query_string}
- end
- end
-
- end
- end
-end
diff --git a/lib/aeolus_image/model/warehouse_model.rb
b/lib/aeolus_image/model/warehouse_model.rb
deleted file mode 100644
index 2586f6d..0000000
--- a/lib/aeolus_image/model/warehouse_model.rb
+++ /dev/null
@@ -1,162 +0,0 @@
-# Copyright 2011 Red Hat, Inc.
-#
-# Licensed 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 Aeolus
- module Image
- # require 'warehouse_client'
- include Warehouse
- class BucketObjectNotFound < Exception;end
- class BucketNotFound < Exception;end
-
- class WarehouseModel
-
- def ==(other_obj)
- # If the objects have different instance variables defined, they're
definitely not ==
- return false unless instance_variables.sort ==
other_obj.instance_variables.sort
- # Otherwise, ensure that they're all the same
- instance_variables.each do |iv|
- return false unless other_obj.instance_variable_get(iv) ==
instance_variable_get(iv)
- end
- # They have the same instance variables and values, so they're equal
- true
- end
-
- class << self
- attr_accessor :warehouse, :bucket, :bucket_name
-
- def set_warehouse_and_bucket
- begin
- @@config ||= load_config
- self.warehouse = Warehouse::Client.new(@@config[:iwhd][:url])
- self.bucket = self.warehouse.bucket(@bucket_name)
- rescue
- raise BucketNotFound
- end
- end
-
- def bucket_objects
- self.set_warehouse_and_bucket if self.bucket.nil?
-
- begin
- self.bucket.objects
- rescue RestClient::ResourceNotFound
- []
- end
- end
-
- def first
- obj = bucket_objects.first
- obj ? self.new(obj.attrs(obj.attr_list)) : nil
- end
-
- def last
- obj = bucket_objects.last
- obj ? self.new(obj.attrs(obj.attr_list)) : nil
- end
-
- def all
- bucket_objects.map do |wh_object|
- self.new(wh_object.attrs(wh_object.attr_list))
- end
- end
-
- def find(uuid)
- self.set_warehouse_and_bucket if self.bucket.nil?
- begin
- if self.bucket.include?(uuid)
-
self.new(self.bucket.object(uuid).attrs(self.bucket.object(uuid).attr_list))
- else
- nil
- end
- rescue RestClient::ResourceNotFound
- nil
- end
- end
-
- def where(query_string)
- self.set_warehouse_and_bucket if self.bucket.nil?
- self.warehouse.query(@bucket_name, query_string)
- end
-
- def delete(uuid)
- self.set_warehouse_and_bucket if self.bucket.nil?
- begin
- if self.bucket.include?(uuid)
- self.bucket.object(uuid).delete!
- else
- false
- end
- rescue RestClient::ResourceNotFound
- false
- end
- end
-
- protected
- # Copy over entirely too much code to load the config file
- def load_config
- # TODO - Is this always the case? We should probably have /etc/aeolus-cli or
something too?
- # Or allow Rails to override this
- @config_location ||= "~/.aeolus-cli"
- begin
- file_str = read_file(@config_location)
- if is_file?(@config_location) &&
!file_str.include?(":url")
- lines = File.readlines(File.expand_path((a)config_location)).map do |line|
- "#" + line
- end
- File.open(File.expand_path(@config_location), 'w') do |file|
- file.puts lines
- end
- write_file
- end
- write_file unless is_file?(@config_location)
- YAML::load(File.open(File.expand_path(@config_location)))
- rescue Errno::ENOENT
- #TODO: Create a custom exception to wrap CLI Exceptions
- raise "Unable to locate or write configuration file: \"" +
@config_location + "\""
- end
- end
-
- def write_file
- example = File.read(File.expand_path(File.dirname(__FILE__) +
"/../../examples/aeolus-cli"))
- File.open(File.expand_path(@config_location), 'a+') do |f|
- f.write(example)
- end
- end
-
- def read_file(path)
- begin
- full_path = File.expand_path(path)
- if is_file?(path)
- File.read(full_path)
- else
- return nil
- end
- rescue
- nil
- end
- end
-
- def is_file?(path)
- full_path = File.expand_path(path)
- if File.exist?(full_path) && !File.directory?(full_path)
- return true
- end
- false
- end
-
- end
-
- end
- end
-end
--
1.7.6.2
Hi Martyn (and Cc'ing the list),
You had sent this to me to review prior to sending a finalized version
to the list. My understanding is that you sent this about 6 hours ago,
but it still hasn't come through the last. (I just got mail sent about
12 hours ago... Yikes.)
This evening I had indicated that I had reviewed the code but was
waiting for the various fixes to be aggregated and sent to the list with
some whitespace errors fixed before I'd give it my official ACK. I
believe you sent this several hours ago, but that it's stuck in a queue
somewhere.
To try to get this thing wrapped up before the weekend, I'm going to go
ahead and give a conditional ACK -- conditional on fixing whitespace
issues and modifying aeolus_image.rb to include the missing include we
discussed on IRC, but otherwise not introducing any new changes.
Best,
Matt