virtengine_api 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +5 -0
  5. data/LICENSE +21 -0
  6. data/README.md +27 -0
  7. data/Rakefile +10 -0
  8. data/lib/megam/api.rb +329 -0
  9. data/lib/megam/api/accounts.rb +96 -0
  10. data/lib/megam/api/addons.rb +27 -0
  11. data/lib/megam/api/assemblies.rb +49 -0
  12. data/lib/megam/api/assembly.rb +56 -0
  13. data/lib/megam/api/backups.rb +57 -0
  14. data/lib/megam/api/balances.rb +45 -0
  15. data/lib/megam/api/billedhistories.rb +35 -0
  16. data/lib/megam/api/billingtransactions.rb +25 -0
  17. data/lib/megam/api/components.rb +24 -0
  18. data/lib/megam/api/credits.rb +34 -0
  19. data/lib/megam/api/disks.rb +44 -0
  20. data/lib/megam/api/domains.rb +25 -0
  21. data/lib/megam/api/errors.rb +29 -0
  22. data/lib/megam/api/eventsall.rb +36 -0
  23. data/lib/megam/api/eventsbilling.rb +35 -0
  24. data/lib/megam/api/eventscontainer.rb +35 -0
  25. data/lib/megam/api/eventsmarketplace.rb +35 -0
  26. data/lib/megam/api/eventsstorage.rb +24 -0
  27. data/lib/megam/api/eventsvm.rb +35 -0
  28. data/lib/megam/api/flavors.rb +56 -0
  29. data/lib/megam/api/license.rb +26 -0
  30. data/lib/megam/api/marketplaces.rb +68 -0
  31. data/lib/megam/api/organizations.rb +50 -0
  32. data/lib/megam/api/promos.rb +18 -0
  33. data/lib/megam/api/quotas.rb +47 -0
  34. data/lib/megam/api/rawimages.rb +36 -0
  35. data/lib/megam/api/reports.rb +24 -0
  36. data/lib/megam/api/requests.rb +36 -0
  37. data/lib/megam/api/sensors.rb +35 -0
  38. data/lib/megam/api/snapshots.rb +46 -0
  39. data/lib/megam/api/sshkeys.rb +35 -0
  40. data/lib/megam/api/subscriptions.rb +26 -0
  41. data/lib/megam/api/version.rb +6 -0
  42. data/lib/megam/core/account.rb +245 -0
  43. data/lib/megam/core/account_collection.rb +122 -0
  44. data/lib/megam/core/addons.rb +169 -0
  45. data/lib/megam/core/addons_collection.rb +121 -0
  46. data/lib/megam/core/assemblies.rb +191 -0
  47. data/lib/megam/core/assemblies_collection.rb +122 -0
  48. data/lib/megam/core/assembly.rb +226 -0
  49. data/lib/megam/core/assembly_collection.rb +122 -0
  50. data/lib/megam/core/backups.rb +259 -0
  51. data/lib/megam/core/backups_collection.rb +122 -0
  52. data/lib/megam/core/balances.rb +187 -0
  53. data/lib/megam/core/balances_collection.rb +121 -0
  54. data/lib/megam/core/billedhistories.rb +190 -0
  55. data/lib/megam/core/billedhistories_collection.rb +121 -0
  56. data/lib/megam/core/billingtransactions.rb +214 -0
  57. data/lib/megam/core/billingtransactions_collection.rb +122 -0
  58. data/lib/megam/core/components.rb +326 -0
  59. data/lib/megam/core/components_collection.rb +123 -0
  60. data/lib/megam/core/credits.rb +146 -0
  61. data/lib/megam/core/credits_collection.rb +121 -0
  62. data/lib/megam/core/disks.rb +199 -0
  63. data/lib/megam/core/disks_collection.rb +122 -0
  64. data/lib/megam/core/domain_collection.rb +122 -0
  65. data/lib/megam/core/domains.rb +118 -0
  66. data/lib/megam/core/error.rb +70 -0
  67. data/lib/megam/core/eventsall.rb +186 -0
  68. data/lib/megam/core/eventsall_collection.rb +122 -0
  69. data/lib/megam/core/eventsbilling.rb +174 -0
  70. data/lib/megam/core/eventsbilling_collection.rb +122 -0
  71. data/lib/megam/core/eventscontainer.rb +187 -0
  72. data/lib/megam/core/eventscontainer_collection.rb +122 -0
  73. data/lib/megam/core/eventsmarketplace.rb +187 -0
  74. data/lib/megam/core/eventsmarketplace_collection.rb +122 -0
  75. data/lib/megam/core/eventsstorage.rb +156 -0
  76. data/lib/megam/core/eventsstorage_collection.rb +122 -0
  77. data/lib/megam/core/eventsvm.rb +187 -0
  78. data/lib/megam/core/eventsvm_collection.rb +122 -0
  79. data/lib/megam/core/flavors.rb +294 -0
  80. data/lib/megam/core/flavors_collection.rb +121 -0
  81. data/lib/megam/core/json_compat.rb +289 -0
  82. data/lib/megam/core/konipai.rb +42 -0
  83. data/lib/megam/core/license.rb +101 -0
  84. data/lib/megam/core/license_collection.rb +122 -0
  85. data/lib/megam/core/log.rb +19 -0
  86. data/lib/megam/core/marketplace.rb +308 -0
  87. data/lib/megam/core/marketplace_collection.rb +123 -0
  88. data/lib/megam/core/monologger.rb +89 -0
  89. data/lib/megam/core/organizations.rb +142 -0
  90. data/lib/megam/core/organizations_collection.rb +121 -0
  91. data/lib/megam/core/promos.rb +145 -0
  92. data/lib/megam/core/quotas.rb +215 -0
  93. data/lib/megam/core/quotas_collection.rb +121 -0
  94. data/lib/megam/core/rawimages.rb +194 -0
  95. data/lib/megam/core/rawimages_collection.rb +121 -0
  96. data/lib/megam/core/reports.rb +176 -0
  97. data/lib/megam/core/reports_collection.rb +121 -0
  98. data/lib/megam/core/request.rb +197 -0
  99. data/lib/megam/core/request_collection.rb +121 -0
  100. data/lib/megam/core/rest_adapter.rb +44 -0
  101. data/lib/megam/core/sensors.rb +141 -0
  102. data/lib/megam/core/sensors_collection.rb +121 -0
  103. data/lib/megam/core/snapshots.rb +268 -0
  104. data/lib/megam/core/snapshots_collection.rb +122 -0
  105. data/lib/megam/core/sshkey.rb +173 -0
  106. data/lib/megam/core/sshkey_collection.rb +122 -0
  107. data/lib/megam/core/stuff.rb +22 -0
  108. data/lib/megam/core/subscriptions.rb +167 -0
  109. data/lib/megam/core/subscriptions_collection.rb +121 -0
  110. data/lib/megam/core/text.rb +87 -0
  111. data/lib/megam/core/text_formatter.rb +64 -0
  112. data/lib/megam/mixins/assemblies.rb +16 -0
  113. data/lib/megam/mixins/assembly.rb +59 -0
  114. data/lib/megam/mixins/common_deployable.rb +78 -0
  115. data/lib/megam/mixins/components.rb +182 -0
  116. data/lib/megam/mixins/megam_attributes.rb +30 -0
  117. data/lib/megam/mixins/outputs.rb +23 -0
  118. data/lib/megam/mixins/policies.rb +27 -0
  119. data/lib/megam_api.rb +1 -0
  120. data/megam_api.gemspec +26 -0
  121. data/test/mixins/test_assemblies.rb +113 -0
  122. data/test/mixins/test_assembly.rb +74 -0
  123. data/test/mixins/test_component.rb +19 -0
  124. data/test/test_accounts.rb +127 -0
  125. data/test/test_addons.rb +26 -0
  126. data/test/test_assemblies.rb +88 -0
  127. data/test/test_assembly.rb +37 -0
  128. data/test/test_backups.rb +29 -0
  129. data/test/test_balances.rb +38 -0
  130. data/test/test_billedhistories.rb +30 -0
  131. data/test/test_billingtranscations.rb +35 -0
  132. data/test/test_components.rb +42 -0
  133. data/test/test_credits.rb +28 -0
  134. data/test/test_disks.rb +25 -0
  135. data/test/test_domains.rb +29 -0
  136. data/test/test_eventsbilling.rb +30 -0
  137. data/test/test_eventscontainer.rb +26 -0
  138. data/test/test_eventsstorage.rb +12 -0
  139. data/test/test_eventsvm.rb +26 -0
  140. data/test/test_helper.rb +77 -0
  141. data/test/test_marketplaces.rb +38 -0
  142. data/test/test_organizations.rb +45 -0
  143. data/test/test_promos.rb +11 -0
  144. data/test/test_quotas.rb +33 -0
  145. data/test/test_reports.rb +32 -0
  146. data/test/test_requests.rb +95 -0
  147. data/test/test_sensors.rb +50 -0
  148. data/test/test_snapshots.rb +30 -0
  149. data/test/test_sshkeys.rb +50 -0
  150. data/test/test_subscriptions.rb +22 -0
  151. metadata +325 -0
@@ -0,0 +1,123 @@
1
+ module Megam
2
+ class MarketPlaceCollection
3
+ include Enumerable
4
+
5
+ attr_reader :iterator
6
+ def initialize
7
+ @apps = Array.new
8
+ @apps_by_name = Hash.new
9
+ @insert_after_idx = nil
10
+ end
11
+
12
+ def all_apps
13
+ @apps
14
+ end
15
+
16
+ def [](index)
17
+ @apps[index]
18
+ end
19
+
20
+ def []=(index, arg)
21
+ is_megam_app(arg)
22
+ @apps[index] = arg
23
+ @apps_by_name[arg.flavor] = index
24
+ end
25
+
26
+ def <<(*args)
27
+ args.flatten.each do |a|
28
+ is_megam_app(a)
29
+ @apps << a
30
+ @apps_by_name[a.flavor] = @apps.length - 1
31
+ end
32
+ self
33
+ end
34
+
35
+ # 'push' is an alias method to <<
36
+ alias_method :push, :<<
37
+
38
+ def insert(app)
39
+ is_megam_app(app)
40
+ if @insert_after_idx
41
+ # in the middle of executing a run, so any nodes inserted now should
42
+ # be placed after the most recent addition done by the currently executing
43
+ # node
44
+ @apps.insert(@insert_after_idx + 1, app)
45
+ # update name -> location mappings and register new node
46
+ @apps_by_name.each_key do |key|
47
+ @apps_by_name[key] += 1 if @apps_by_name[key] > @insert_after_idx
48
+ end
49
+ @apps_by_name[app.flavor] = @insert_after_idx + 1
50
+ @insert_after_idx += 1
51
+ else
52
+ @apps << app
53
+ @apps_by_name[app.flavor] = @apps.length - 1
54
+ end
55
+ end
56
+
57
+ def each
58
+ @apps.each do |app|
59
+ yield app
60
+ end
61
+ end
62
+
63
+ def each_index
64
+ @apps.each_index do |i|
65
+ yield i
66
+ end
67
+ end
68
+
69
+ def empty?
70
+ @apps.empty?
71
+ end
72
+
73
+ def lookup(app)
74
+ lookup_by = nil
75
+ if app.kind_of?(Megam::MarketPlace)
76
+ lookup_by = app.flavor
77
+ elsif app.kind_of?(String)
78
+ lookup_by = app
79
+ else
80
+ raise ArgumentError, "Must pass a Megam::MarketPlace or String to lookup"
81
+ end
82
+ res = @apps_by_name[lookup_by]
83
+ unless res
84
+ raise ArgumentError, "Cannot find a app matching #{lookup_by} (did you define it first?)"
85
+ end
86
+ @apps[res]
87
+ end
88
+
89
+ def to_s
90
+ @apps.join(", ")
91
+ end
92
+
93
+ def for_json
94
+ to_a.map { |item| item.to_s }
95
+ end
96
+
97
+ def to_json(*a)
98
+ Megam::JSONCompat.to_json(for_json, *a)
99
+ end
100
+
101
+ def self.json_create(o)
102
+ collection = self.new()
103
+ o["results"].each do |apps_list|
104
+ apps_array = apps_list.kind_of?(Array) ? apps_list : [ apps_list ]
105
+ apps_array.each do |app|
106
+ collection.insert(app)
107
+ end
108
+ end
109
+ collection
110
+ end
111
+
112
+ private
113
+
114
+
115
+
116
+ def is_megam_app(arg)
117
+ unless arg.kind_of?(Megam::MarketPlace)
118
+ raise ArgumentError, "Members must be Megam::MarketPlace's"
119
+ end
120
+ true
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,89 @@
1
+ require 'logger'
2
+ require 'pp'
3
+
4
+ module Megam
5
+ #== MonoLogger
6
+ # A subclass of Ruby's stdlib Logger with all the mutex and logrotation stuff
7
+ # ripped out.
8
+ class MonoLogger < Logger
9
+ #
10
+ # === Synopsis
11
+ #
12
+ # Logger.new(name, shift_age = 7, shift_size = 1048576)
13
+ # Logger.new(name, shift_age = 'weekly')
14
+ #
15
+ # === Args
16
+ #
17
+ # +logdev+::
18
+ # The log device. This is a filename (String) or IO object (typically
19
+ # +STDOUT+, +STDERR+, or an open file).
20
+ # +shift_age+::
21
+ # Number of old log files to keep, *or* frequency of rotation (+daily+,
22
+ # +weekly+ or +monthly+).
23
+ # +shift_size+::
24
+ # Maximum logfile size (only applies when +shift_age+ is a number).
25
+ #
26
+ # === Description
27
+ #
28
+ # Create an instance.
29
+ #
30
+ def initialize(logdev)
31
+ @progname = nil
32
+ @level = DEBUG
33
+ @default_formatter = Formatter.new
34
+ @formatter = nil
35
+ @logdev = nil
36
+ if logdev
37
+ @logdev = LocklessLogDevice.new(logdev)
38
+ end
39
+ end
40
+
41
+ class LocklessLogDevice < LogDevice
42
+ def initialize(log = nil)
43
+ @dev = @filename = @shift_age = @shift_size = nil
44
+ if log.respond_to?(:write) and log.respond_to?(:close)
45
+ @dev = log
46
+ else
47
+ @dev = open_logfile(log)
48
+ @dev.sync = true
49
+ @filename = log
50
+ end
51
+ end
52
+
53
+ def write(message)
54
+ @dev.write(message)
55
+ rescue Exception => ignored
56
+ warn("log writing failed. #{ignored}")
57
+ end
58
+
59
+ def close
60
+ @dev.close rescue nil
61
+ end
62
+
63
+ private
64
+
65
+ def open_logfile(filename)
66
+ if (FileTest.exist?(filename))
67
+ open(filename, (File::WRONLY | File::APPEND))
68
+ else
69
+ create_logfile(filename)
70
+ end
71
+ end
72
+
73
+ def create_logfile(filename)
74
+ logdev = open(filename, (File::WRONLY | File::APPEND | File::CREAT))
75
+ logdev.sync = true
76
+ add_log_header(logdev)
77
+ logdev
78
+ end
79
+
80
+ def add_log_header(file)
81
+ file.write(
82
+ "# Logfile created on %s by %s\n" % [Time.now.to_s, Logger::ProgName]
83
+ )
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,142 @@
1
+ module Megam
2
+ class Organizations < Megam::RestAdapter
3
+ def initialize(o)
4
+ @id = nil
5
+ @name = nil
6
+ @accounts_id = nil
7
+ @related_orgs = []
8
+ @created_at = nil
9
+ super(o)
10
+ end
11
+
12
+ def organization
13
+ self
14
+ end
15
+
16
+ def id(arg=nil)
17
+ if arg != nil
18
+ @id = arg
19
+ else
20
+ @id
21
+ end
22
+ end
23
+
24
+ def accounts_id(arg=nil)
25
+ if arg != nil
26
+ @accounts_id = arg
27
+ else
28
+ @accounts_id
29
+ end
30
+ end
31
+
32
+ def name(arg=nil)
33
+ if arg != nil
34
+ @name = arg
35
+ else
36
+ @name
37
+ end
38
+ end
39
+
40
+ def related_orgs(arg=[])
41
+ if arg != []
42
+ @related_orgs = arg
43
+ else
44
+ @related_orgs
45
+ end
46
+ end
47
+
48
+ def created_at(arg=nil)
49
+ if arg != nil
50
+ @created_at = arg
51
+ else
52
+ @created_at
53
+ end
54
+ end
55
+
56
+ # Transform the ruby obj -> to a Hash
57
+ def to_hash
58
+ index_hash = Hash.new
59
+ index_hash["json_claz"] = self.class.name
60
+ index_hash["id"] = id
61
+ index_hash["name"] = name
62
+ index_hash["accounts_id"] = accounts_id
63
+ index_hash["related_orgs"] = related_orgs
64
+ index_hash["created_at"] = created_at
65
+ index_hash
66
+ end
67
+
68
+ def to_json(*a)
69
+ for_json.to_json(*a)
70
+ end
71
+
72
+ def for_json
73
+ result = {
74
+ "id" => id,
75
+ "name" => name,
76
+ "accounts_id" => accounts_id,
77
+ "related_orgs" => related_orgs,
78
+ "created_at" => created_at
79
+ }
80
+ result
81
+ end
82
+
83
+ # Create a Megam::Organization from JSON (used by the backgroud job workers)
84
+ def self.json_create(o)
85
+ org = new({})
86
+ org.id(o["id"]) if o.has_key?("id")
87
+ org.name(o["name"]) if o.has_key?("name")
88
+ org.accounts_id(o["accounts_id"]) if o.has_key?("accounts_id")
89
+ org.related_orgs(o["related_orgs"]) if o.has_key?("related_orgs")
90
+ org.created_at(o["created_at"]) if o.has_key?("created_at")
91
+ org
92
+ end
93
+
94
+ def self.from_hash(o)
95
+ org = self.new(o)
96
+ org.from_hash(o)
97
+ org
98
+ end
99
+
100
+ def from_hash(o)
101
+ @id = o[:id] if o.has_key?(:id)
102
+ @name = o[:name] if o.has_key?(:name)
103
+ @accounts_id = o[:accounts_id] if o.has_key?(:accounts_id)
104
+ @related_orgs = o[:related_orgs] if o.has_key?(:related_orgs)
105
+ @created_at = o[:created_at] if o.has_key?(:created_at)
106
+ self
107
+ end
108
+
109
+ def self.create(o)
110
+ org = from_hash(o)
111
+ org.create
112
+ end
113
+
114
+ def self.show(o)
115
+ org = from_hash(o)
116
+ org.megam_rest.get_organizations(email)
117
+ end
118
+
119
+ def self.update(o)
120
+ org = from_hash(o)
121
+ org.update
122
+ end
123
+
124
+ def update
125
+ megam_rest.update_organization(to_hash)
126
+ end
127
+
128
+ def self.list(o)
129
+ org = from_hash(o)
130
+ org.megam_rest.get_organizations
131
+ end
132
+
133
+ def create
134
+ megam_rest.post_organization(to_hash)
135
+ end
136
+
137
+ def to_s
138
+ Megam::Stuff.styled_hash(to_hash)
139
+ end
140
+
141
+ end
142
+ end
@@ -0,0 +1,121 @@
1
+ module Megam
2
+ class OrganizationsCollection
3
+ include Enumerable
4
+
5
+ attr_reader :iterator
6
+ def initialize
7
+ @organizations = Array.new
8
+ @organizations_by_name = Hash.new
9
+ @insert_after_idx = nil
10
+ end
11
+
12
+ def all_organizations
13
+ @organizations
14
+ end
15
+
16
+ def [](index)
17
+ @organizations[index]
18
+ end
19
+
20
+ def []=(index, arg)
21
+ is_megam_organizations(arg)
22
+ @organizations[index] = arg
23
+ @organizations_by_name[arg.name] = index
24
+ end
25
+
26
+ def <<(*args)
27
+ args.flatten.each do |a|
28
+ is_megam_organizations(a)
29
+ @organizations << a
30
+ @organizations_by_name[a.name] =@organizations.length - 1
31
+ end
32
+ self
33
+ end
34
+
35
+ # 'push' is an alias method to <<
36
+ alias_method :push, :<<
37
+
38
+ def insert(organizations)
39
+ is_megam_organizations(organizations)
40
+ if @insert_after_idx
41
+ # in the middle of executing a run, so any predefs inserted now should
42
+ # be placed after the most recent addition done by the currently executing
43
+ # predefclouds
44
+ @organizations.insert(@insert_after_idx + 1, organizations)
45
+ # update name -> location mappings and register new predefclouds
46
+ @organizations_by_name.each_key do |key|
47
+ @organizations_by_name[key] += 1 if@organizations_by_name[key] > @insert_after_idx
48
+ end
49
+ @organizations_by_name[organizations.name] = @insert_after_idx + 1
50
+ @insert_after_idx += 1
51
+ else
52
+ @organizations << organizations
53
+ @organizations_by_name[organizations.name] =@organizations.length - 1
54
+ end
55
+ end
56
+
57
+ def each
58
+ @organizations.each do |organizations|
59
+ yield organizations
60
+ end
61
+ end
62
+
63
+ def each_index
64
+ @organizations.each_index do |i|
65
+ yield i
66
+ end
67
+ end
68
+
69
+ def empty?
70
+ @organizations.empty?
71
+ end
72
+
73
+ def lookup(organizations)
74
+ lookup_by = nil
75
+ if organizations.kind_of?(Megam::Organizations)
76
+ lookup_by = organizations.name
77
+ elsif organizations.kind_of?(String)
78
+ lookup_by = organizations
79
+ else
80
+ raise ArgumentError, "Must pass a Megam::PredefClouds or String to lookup"
81
+ end
82
+ res =@organizations_by_name[lookup_by]
83
+ unless res
84
+ raise ArgumentError, "Cannot find a predefclouds matching #{lookup_by} (did you define it first?)"
85
+ end
86
+ @organizations[res]
87
+ end
88
+
89
+ def to_s
90
+ @organizations.join(", ")
91
+ end
92
+
93
+ def for_json
94
+ to_a.map { |item| item.to_s }
95
+ end
96
+
97
+ def to_json(*a)
98
+ Megam::JSONCompat.to_json(for_json, *a)
99
+ end
100
+
101
+ def self.json_create(o)
102
+ collection = self.new()
103
+ o["results"].each do |organizations_list|
104
+ organizations_array = organizations_list.kind_of?(Array) ? organizations_list : [ organizations_list ]
105
+ organizations_array.each do |organizations|
106
+ collection.insert(organizations)
107
+ end
108
+ end
109
+ collection
110
+ end
111
+
112
+ private
113
+
114
+ def is_megam_organizations(arg)
115
+ unless arg.kind_of?(Megam::Organizations)
116
+ raise ArgumentError, "Members must be Megam::Organizations's"
117
+ end
118
+ true
119
+ end
120
+ end
121
+ end