mms-api 0.0.10 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7f238c7242a72f7afcaf801e4471a6a772377b30
4
- data.tar.gz: b7db404c176c296832c46552d104a7adb8abb899
3
+ metadata.gz: 91354b2007ab1bf12006b201e465bbc64c7c4e73
4
+ data.tar.gz: 0c1fdc6932a86acdc3f3f41061f2dcb8782bd612
5
5
  SHA512:
6
- metadata.gz: b8dca3e5b69c6dc916920e52abffb1d1647f6a59571cbdf0307714564f7a8e43256dbb78ce46bea5d937eca2def867dc92e43d04e2ebd4e3182d2984df680ad8
7
- data.tar.gz: 98f2a85f55e5f1cf942dda16d2745955745dee3ff52afbcb60d3c3261aa332e1e978d804eafeb16e99c59fd85098468f1c71b1e0e1dcbe6fd5b6824cf78e4b97
6
+ metadata.gz: 78d3bde92f63163a64454077f6edee97d82619458c3329f9ba5fa6f84eb2414a04452b46be57f3d0d8fabb9a9862fe2cc67ff48919c90433641b9bd621660479
7
+ data.tar.gz: e0210ba968b2d67ba035700b952b67445c896ab9b849ba1e1d9899369f18286b57c8d11aa45301de47d02a8cd6eb95815bb17b7e35819092c2f4712be82ff640
data/lib/mms.rb CHANGED
@@ -21,6 +21,7 @@ module MMS
21
21
  require 'mms/resource/host'
22
22
  require 'mms/resource/cluster'
23
23
  require 'mms/resource/snapshot'
24
+ require 'mms/resource/snapshot_schedule'
24
25
  require 'mms/resource/restore_job'
25
26
  require 'mms/resource/alert'
26
27
 
@@ -4,18 +4,30 @@ module MMS
4
4
 
5
5
  attr_accessor :client
6
6
 
7
+ # @param [MMS::Client] client
7
8
  def initialize(client)
8
9
  @client = client
9
10
  end
10
11
 
12
+ # @param [String] apiurl
11
13
  def set_apiurl(apiurl)
12
14
  @client.url = apiurl
13
15
  end
14
16
 
17
+ # @return [Array<MMS::Resource::Group>]
15
18
  def groups
16
- MMS::Resource::Group.findGroups(@client)
19
+ group_list = []
20
+ client.get('/groups').each do |group|
21
+ g = MMS::Resource::Group.new
22
+ g.set_client(client)
23
+ g.set_data(group)
24
+
25
+ group_list.push g
26
+ end
27
+ group_list
17
28
  end
18
29
 
30
+ # @return [Array<MMS::Resource::Host>]
19
31
  def hosts
20
32
  host_list = []
21
33
  groups.each do |group|
@@ -24,6 +36,7 @@ module MMS
24
36
  host_list
25
37
  end
26
38
 
39
+ # @return [Array<MMS::Resource::Cluster>]
27
40
  def clusters
28
41
  cluster_list = []
29
42
  groups.each do |group|
@@ -32,6 +45,7 @@ module MMS
32
45
  cluster_list
33
46
  end
34
47
 
48
+ # @return [Array<MMS::Resource::Snapshot>]
35
49
  def snapshots
36
50
  snapshot_list = []
37
51
  clusters.each do |cluster|
@@ -40,6 +54,7 @@ module MMS
40
54
  snapshot_list.sort_by { |snapshot| snapshot.created_date }.reverse
41
55
  end
42
56
 
57
+ # @return [Array<MMS::Resource::Alert>]
43
58
  def alerts
44
59
  alert_list = []
45
60
  groups.each do |group|
@@ -48,6 +63,7 @@ module MMS
48
63
  alert_list.sort_by { |alert| alert.created }.reverse
49
64
  end
50
65
 
66
+ # @return [Array<MMS::Resource::RestoreJob>]
51
67
  def restorejobs
52
68
  restorejob_list = []
53
69
  clusters.each do |cluster|
@@ -56,32 +72,43 @@ module MMS
56
72
  restorejob_list.sort_by { |job| job.created }.reverse
57
73
  end
58
74
 
75
+ # @param [String] type_value
76
+ # @param [String] group_id
77
+ # @param [String] cluster_id
78
+ # @return [Array<MMS::Resource::RestoreJob>]
59
79
  def restorejob_create(type_value, group_id, cluster_id)
60
80
  if type_value.length == 24
61
- findGroup(group_id).cluster(cluster_id).snapshot(type_value).create_restorejob
81
+ find_group(group_id).cluster(cluster_id).snapshot(type_value).create_restorejob
62
82
  elsif datetime = (type_value == 'now' ? DateTime.now : DateTime.parse(type_value))
63
83
  raise('Invalid datetime. Correct `YYYY-MM-RRTH:m:s`') if datetime.nil?
64
84
  datetime_string = [[datetime.year, datetime.day, datetime.month].join('-'), 'T', [datetime.hour, datetime.minute, datetime.second].join(':'), 'Z'].join
65
- findGroup(group_id).cluster(cluster_id).create_restorejob(datetime_string)
85
+ find_group(group_id).cluster(cluster_id).create_restorejob(datetime_string)
66
86
  end
67
87
  end
68
88
 
89
+ # @param [String] alert_id
90
+ # @param [String, Integer] timestamp
91
+ # @param [String] group_id
92
+ # @return [TrueClass, FalseClass]
69
93
  def alert_ack(alert_id, timestamp, group_id)
70
94
  timestamp = DateTime.now if timestamp == 'now'
71
95
  timestamp = DateTime.new(4000, 1, 1, 1, 1, 1, 1, 1) if timestamp == 'forever'
72
96
 
73
- group = findGroup(group_id)
97
+ group = find_group(group_id)
74
98
 
75
99
  if alert_id == 'all'
76
100
  group.alerts.each do |alert|
77
101
  alert.ack(timestamp, 'Triggered by CLI for all alerts.')
78
102
  end
79
- elsif group.alert(alert_id).ack(timestamp, 'Triggered by CLI.')
103
+ else
104
+ group.alert(alert_id).ack(timestamp, 'Triggered by CLI.')
80
105
  end
81
106
  end
82
107
 
83
- def findGroup(id)
84
- MMS::Resource::Group.new(@client, {'id' => id})
108
+ # @param [String] id
109
+ # @return [MMS::Resource::Group]
110
+ def find_group(id)
111
+ MMS::Resource::Group.find(@client, id)
85
112
  end
86
113
 
87
114
  end
@@ -12,14 +12,19 @@ module MMS
12
12
  @storage = Hash.new {|hash, key| hash[key] = nil }
13
13
  end
14
14
 
15
+ # @param [String] key
16
+ # @param [Object] value
15
17
  def set(key, value)
16
18
  @storage[key] = value
17
19
  end
18
20
 
21
+ # @param [String] key
22
+ # @return [Object]
19
23
  def get(key)
20
24
  @storage[key].nil? ? nil : @storage[key]
21
25
  end
22
26
 
27
+ # @param [String] key
23
28
  def delete(key)
24
29
  @storage.delete key unless @storage[key].nil?
25
30
  end
@@ -71,15 +71,35 @@ module MMS
71
71
 
72
72
  end
73
73
 
74
+ # @return [MMS::Agent]
74
75
  def agent
75
76
  @client = MMS::Client.new(@config.username, @config.apikey)
76
77
  @agent = MMS::Agent.new(client)
77
78
  end
78
79
 
80
+ # @return [Array<MMS::Resource::Group>]
81
+ def groups
82
+ id = ignore? ? nil : @config.default_group_id
83
+ id.nil? ? agent.groups : [agent.find_group(id)]
84
+ end
85
+
86
+ # @return [Array<MMS::Resource::Cluster>]
87
+ def clusters
88
+ id = ignore? ? nil : @config.default_cluster_id
89
+
90
+ groups.collect! do |group|
91
+ id.nil? ? group.clusters : group.cluster(id)
92
+ end.flatten
93
+ end
94
+
95
+ # @param [String] heading
96
+ # @param [Array<MMS::Resource>]
79
97
  def print(heading, resource_list)
80
98
  json? ? print_json(resource_list) : print_human(heading, resource_list)
81
99
  end
82
100
 
101
+ # @param [String] heading
102
+ # @param [Array<MMS::Resource>]
83
103
  def print_human(heading, resource_list)
84
104
  rows = []
85
105
 
@@ -87,11 +107,12 @@ module MMS
87
107
  rows += resource.table_section
88
108
  end
89
109
 
90
- puts Terminal::Table.new :title => 'Hosts', :headings => (heading.nil? ? [] : heading), :rows => rows
110
+ puts Terminal::Table.new :headings => (heading.nil? ? [] : heading), :rows => rows
91
111
 
92
112
  print_tips unless ignore?
93
113
  end
94
114
 
115
+ # @param [Array<MMS::Resource>]
95
116
  def print_json(resource_list)
96
117
  rows = []
97
118
 
@@ -111,6 +132,8 @@ module MMS
111
132
  end
112
133
  end
113
134
 
135
+
136
+ # @param [Array] arguments
114
137
  def run(arguments)
115
138
  begin
116
139
  parse_user_home_config
@@ -127,27 +150,24 @@ module MMS
127
150
  end
128
151
  end
129
152
 
130
- class MMS::CLI::Command::Hosts < MMS::CLI::Command
153
+ class MMS::CLI::Command::Groups < MMS::CLI::Command
131
154
 
132
- subcommand 'list', 'Host list' do
155
+ subcommand 'list', 'Group list' do
133
156
 
134
157
  def execute
135
- print(MMS::Resource::Host.table_header, agent.hosts)
158
+ print(MMS::Resource::Group.table_header, groups)
136
159
  end
137
160
  end
138
161
 
139
162
  end
140
163
 
141
- class MMS::CLI::Command::Groups < MMS::CLI::Command
164
+ class MMS::CLI::Command::Hosts < MMS::CLI::Command
142
165
 
143
- subcommand 'list', 'Group list' do
166
+ subcommand 'list', 'Host list' do
144
167
 
145
168
  def execute
146
-
147
- group_list = agent.groups
148
- group_list.reject! { |group| group.id != @config.default_group_id } unless @config.default_group_id.nil? or ignore?
149
-
150
- print(MMS::Resource::Group.table_header, group_list)
169
+ host_list = groups.collect! { |group| group.hosts }.flatten
170
+ print(MMS::Resource::Host.table_header, host_list)
151
171
  end
152
172
  end
153
173
 
@@ -158,10 +178,15 @@ module MMS
158
178
  subcommand 'list', 'Cluster list' do
159
179
 
160
180
  def execute
161
- cluster_list = agent.clusters
162
- cluster_list.reject! { |cluster| cluster.id != @config.default_cluster_id } unless @config.default_cluster_id.nil? or ignore?
181
+ print(MMS::Resource::Cluster.table_header, clusters)
182
+ end
183
+ end
163
184
 
164
- print(MMS::Resource::Cluster.table_header, cluster_list)
185
+ subcommand 'snapshot-schedule', 'Cluster snapshot schedule config' do
186
+
187
+ def execute
188
+ snapshot_schedule_list = clusters.collect! { |cluster| cluster.snapshot_schedule }.flatten
189
+ print(MMS::Resource::SnapshotSchedule.table_header, snapshot_schedule_list)
165
190
  end
166
191
  end
167
192
 
@@ -173,7 +198,8 @@ module MMS
173
198
  subcommand 'list', 'Alerts list' do
174
199
 
175
200
  def execute
176
- print(MMS::Resource::Alert.table_header, agent.alerts)
201
+ alert_list = groups.collect! { |group| group.alerts }.flatten
202
+ print(MMS::Resource::Alert.table_header, alert_list)
177
203
  end
178
204
 
179
205
  end
@@ -199,7 +225,8 @@ module MMS
199
225
  subcommand 'list', 'Snapshot list' do
200
226
 
201
227
  def execute
202
- print(MMS::Resource::Snapshot.table_header, agent.snapshots)
228
+ snapshot_list = clusters.collect! { |cluster| cluster.snapshots }.flatten.sort_by { |snapshot| snapshot.created_date }.reverse
229
+ print(MMS::Resource::Snapshot.table_header, snapshot_list)
203
230
  end
204
231
  end
205
232
 
@@ -210,7 +237,8 @@ module MMS
210
237
  subcommand 'list', 'Restorejob list' do
211
238
 
212
239
  def execute
213
- print(MMS::Resource::RestoreJob.table_header, agent.restorejobs)
240
+ restorejob_list = clusters.collect! { |cluster| cluster.restorejobs }.flatten.sort_by { |job| job.created }.reverse
241
+ print(MMS::Resource::RestoreJob.table_header, restorejob_list)
214
242
  end
215
243
 
216
244
  end
@@ -6,22 +6,33 @@ module MMS
6
6
  attr_accessor :apikey
7
7
  attr_accessor :url
8
8
 
9
+ # @param [String] username
10
+ # @param [String] apikey
11
+ # @param [String] url
9
12
  def initialize(username = nil, apikey = nil, url = nil)
10
13
  @username = username
11
14
  @apikey = apikey
12
15
  @url = url.nil? ? 'https://mms.mongodb.com:443/api/public/v1.0' : url
13
16
  end
14
17
 
18
+ # @param [String] path
19
+ # @return [Hash]
15
20
  def get(path)
16
21
  _get(@url + path, @username, @apikey)
17
22
  end
18
23
 
24
+ # @param [String] path
25
+ # @param [Hash] data
26
+ # @return [Hash]
19
27
  def post(path, data)
20
28
  _post(@url + path, data, @username, @apikey)
21
29
  end
22
30
 
23
31
  private
24
32
 
33
+ # @param [String] path
34
+ # @param [String] username
35
+ # @param [String] password
25
36
  def _get(path, username, password)
26
37
 
27
38
  digest_auth = Net::HTTP::DigestAuth.new
@@ -55,6 +66,10 @@ module MMS
55
66
  (response_json.nil? or response_json['results'].nil?) ? response_json : response_json['results']
56
67
  end
57
68
 
69
+ # @param [String] path
70
+ # @param [Hash] data
71
+ # @param [String] username
72
+ # @param [String] password
58
73
  def _post(path, data, username, password)
59
74
  digest_auth = Net::HTTP::DigestAuth.new
60
75
  digest_auth.next_nonce
@@ -2,6 +2,9 @@ module MMS
2
2
 
3
3
  class RuntimeError < StandardError;
4
4
 
5
+ # @param [String] message
6
+ # @param [Net::HTTPRequest] request
7
+ # @param [Net::HTTPResponse] response
5
8
  def initialize(message, request, response)
6
9
  super(message)
7
10
 
@@ -16,6 +19,8 @@ module MMS
16
19
 
17
20
  class ResourceError < StandardError
18
21
 
22
+ # @param [String] message
23
+ # @param [MMS::Resource] resource
19
24
  def initialize(message, resource)
20
25
  super(message)
21
26
 
@@ -5,13 +5,22 @@ module MMS
5
5
  attr_accessor :id
6
6
  attr_accessor :data
7
7
 
8
- def initialize(id, data = nil)
9
- @id = id
10
- @data = data
8
+ attr_accessor :client
11
9
 
12
- load
10
+ # @param [MMS::Client] client
11
+ def set_client(client)
12
+ @client = client
13
13
  end
14
14
 
15
+ # @param [Hash] data
16
+ def set_data(data)
17
+ @data = data
18
+ from_hash(data)
19
+ cache_key = "Class::#{self.class.name}:#{@id}"
20
+ MMS::Cache.instance.set(cache_key, data)
21
+ end
22
+
23
+ # @param [Hash] data
15
24
  def from_hash(data)
16
25
  unless data.nil?
17
26
  @id = data['id']
@@ -23,38 +32,17 @@ module MMS
23
32
  _to_hash
24
33
  end
25
34
 
26
- def reload
27
- @data = _load(@id)
28
- save @data unless @data.nil? or @data.empty?
29
- end
30
-
31
- def load
32
- _data = MMS::Cache.instance.get "Class::#{self.class.name}:#{@id}"
33
-
34
- if _data.nil? and @data.nil?
35
- _data = _load(@id) unless @id.nil?
36
-
37
- if _data.nil?
38
- raise "Cannot load data for #{self.class.name}, id `#{@id}`"
39
- end
40
- end
41
-
42
- save _data || @data
43
- end
44
-
45
- def save(data)
46
- from_hash data
47
- MMS::Cache.instance.set "Class::#{self.class.name}:#{@id}", data
48
- end
49
-
35
+ # @return [Array<String>]
50
36
  def table_row
51
37
  raise("`#{__method__}` is not implemented for `#{self.class.name}`")
52
38
  end
53
39
 
40
+ # @return [Array]
54
41
  def table_section
55
42
  raise("`#{__method__}` is not implemented for `#{self.class.name}`")
56
43
  end
57
44
 
45
+ # @return [Array<String>]
58
46
  def self.table_header
59
47
  raise("`#{__method__}` is not implemented for `#{self.class.name}`")
60
48
  end
@@ -63,12 +51,30 @@ module MMS
63
51
  raise("`#{__method__}` is not implemented for `#{self.class.name}`")
64
52
  end
65
53
 
54
+ # @param [Hash] data
66
55
  def _from_hash(data)
67
56
  raise("`#{__method__}` is not implemented for `#{self.class.name}`")
68
57
  end
69
58
 
59
+ # @return [Hash]
70
60
  def _to_hash
71
61
  raise("`#{__method__}` is not implemented for `#{self.class.name}`")
72
62
  end
63
+
64
+ # @param [MMS::Client] client
65
+ # @param arguments...
66
+ # @return self
67
+ def self.find(client, *arguments)
68
+ cache_key = "Class::#{self.name}:#{arguments.last()}"
69
+ data = MMS::Cache.instance.get(cache_key)
70
+ unless data
71
+ data = self._find(client, *arguments)
72
+ end
73
+
74
+ resource = self.new
75
+ resource.set_client(client)
76
+ resource.set_data(data)
77
+ resource
78
+ end
73
79
  end
74
80
  end
@@ -2,10 +2,7 @@ module MMS
2
2
 
3
3
  class Resource::Alert < Resource
4
4
 
5
- @client = nil
6
-
7
5
  attr_accessor :name
8
- attr_accessor :group
9
6
 
10
7
  attr_accessor :type_name
11
8
  attr_accessor :event_type_name
@@ -17,37 +14,32 @@ module MMS
17
14
  attr_accessor :last_notified
18
15
  attr_accessor :current_value
19
16
 
20
- def initialize(client, data)
21
- id = data['id']
22
- group_id = data['groupId']
23
-
24
- raise MMS::ResourceError.new('`Id` for alert resource must be defined', self) if id.nil?
25
- raise MMS::ResourceError.new('`groupId` for alert resource must be defined', self) if group_id.nil?
26
-
27
- @client = client
28
-
29
- @group = MMS::Resource::Group.new(client, {'id' => group_id})
30
-
31
- super id, data
17
+ # @return [MMS::Resource::Group]
18
+ def group
19
+ MMS::Resource::Group.find(@client, @data['groupId'])
32
20
  end
33
21
 
22
+
23
+ # @param [Time, Integer] time
24
+ # @param [String] description
25
+ # @return [TrueClass, FalseClass]
34
26
  def ack(time, description)
35
27
  data = {
36
- :acknowledgedUntil => time,
28
+ :acknowledgedUntil => time.to_i,
37
29
  :acknowledgementComment => description
38
30
  }
39
- alert = @client.post '/groups/' + @group.id + '/alerts/' + @id, data
31
+ alert = @client.post '/groups/' + group.id + '/alerts/' + @id, data
40
32
  !alert.nil?
41
33
  end
42
34
 
43
35
  def table_row
44
- [@status, @group.name, @type_name, @event_type_name, @created, @updated, @resolved, @last_notified, JSON.dump(@current_value)]
36
+ [@status, group.name, @type_name, @event_type_name, @created, @updated, @resolved, @last_notified, JSON.dump(@current_value)]
45
37
  end
46
38
 
47
39
  def table_section
48
40
  rows = []
49
41
  rows << table_row
50
- rows << [{:value => "AlertId: #{@id} GroupId: #{@group.id}", :colspan => 9, :alignment => :left}]
42
+ rows << [{:value => "AlertId: #{@id} GroupId: #{group.id}", :colspan => 9, :alignment => :left}]
51
43
  rows << :separator
52
44
  rows
53
45
  end
@@ -56,12 +48,17 @@ module MMS
56
48
  ['Status', 'Group', 'Type', 'Event name', 'Created', 'Updated', 'Resolved', 'Last notified', 'Value']
57
49
  end
58
50
 
59
- private
60
-
61
- def _load(id)
62
- @client.get '/groups/' + @group.id + '/alerts/' + id.to_s
51
+ # @param [MMS::Client] client
52
+ # @param [String] group_id
53
+ # @param [String] id
54
+ # @return [Hash]
55
+ def self._find(client, group_id, id)
56
+ client.get('/groups/' + group_id + '/alerts/' + id)
63
57
  end
64
58
 
59
+ private
60
+
61
+ # @param [Hash] data
65
62
  def _from_hash(data)
66
63
  @type_name = data['typeName']
67
64
  @event_type_name = data['eventTypeName']
@@ -2,10 +2,7 @@ module MMS
2
2
 
3
3
  class Resource::Cluster < Resource
4
4
 
5
- @client = nil
6
-
7
5
  attr_accessor :name
8
- attr_accessor :group
9
6
  attr_accessor :shard_name
10
7
  attr_accessor :replicaset_name
11
8
  attr_accessor :type_name
@@ -14,53 +11,59 @@ module MMS
14
11
  attr_accessor :snapshots
15
12
  attr_accessor :restorejobs
16
13
 
17
- def initialize(client, data)
18
- id = data['id']
19
- group_id = data['groupId']
20
-
21
- raise MMS::ResourceError.new('`Id` for cluster resource must be defined', self) if id.nil?
22
- raise MMS::ResourceError.new('`groupId` for cluster resource must be defined', self) if group_id.nil?
23
-
14
+ def initialize
24
15
  @snapshots = []
25
16
  @restorejobs = []
17
+ end
26
18
 
27
- @client = client
28
-
29
- @group = MMS::Resource::Group.new(client, {'id' => group_id})
30
-
31
- super id, data
19
+ def group
20
+ MMS::Resource::Group.find(@client, @data['groupId'])
32
21
  end
33
22
 
34
23
  def snapshot(id)
35
- MMS::Resource::Snapshot.new(@client, {'id' => id, 'clusterId' => @id, 'groupId' => @group.id})
24
+ MMS::Resource::Snapshot.find(@client, group.id, @id, id)
36
25
  end
37
26
 
38
- def snapshots(page = 1, limit = 10)
27
+ def snapshots(page = 1, limit = 1000)
39
28
  if @snapshots.empty?
40
- @client.get('/groups/' + @group.id + '/clusters/' + @id + '/snapshots?pageNum=' + page.to_s + '&itemsPerPage=' + limit.to_s).each do |snapshot|
41
- @snapshots.push MMS::Resource::Snapshot.new(@client, snapshot)
29
+ @client.get('/groups/' + group.id + '/clusters/' + @id + '/snapshots?pageNum=' + page.to_s + '&itemsPerPage=' + limit.to_s).each do |snapshot|
30
+ s = MMS::Resource::Snapshot.new
31
+ s.set_client(@client)
32
+ s.set_data(snapshot)
33
+
34
+ @snapshots.push s
42
35
  end
43
36
  end
44
37
  @snapshots
45
38
  end
46
39
 
47
- def restorejobs(page = 1, limit = 10)
40
+ def snapshot_schedule
41
+ MMS::Resource::SnapshotSchedule.find(@client, group.id, @id)
42
+ end
43
+
44
+ def restorejobs(page = 1, limit = 1000)
48
45
  if @restorejobs.empty?
49
- @client.get('/groups/' + @group.id + '/clusters/' + @id + '/restoreJobs?pageNum=' + page.to_s + '&itemsPerPage=' + limit.to_s).each do |job|
46
+ @client.get('/groups/' + group.id + '/clusters/' + @id + '/restoreJobs?pageNum=' + page.to_s + '&itemsPerPage=' + limit.to_s).each do |job|
50
47
 
51
48
  if job['snapshotId'].nil? and job['clusterId'].nil?
52
49
  raise MMS::ResourceError.new("RestoreJob `#{job['id']}` with status `#{job['statusName']}` has no `clusterId` and no `snapshotId`.", self)
53
50
  elsif job['clusterId'].nil?
54
- snapshot = @group.findSnapshot(job['snapshotId'])
51
+ snapshot = group.find_snapshot(job['snapshotId'])
55
52
  job['clusterId'] = snapshot.cluster.id unless snapshot.nil?
56
53
  end
57
54
 
58
- @restorejobs.push MMS::Resource::RestoreJob.new(@client, job)
55
+ j = MMS::Resource::RestoreJob.new
56
+ j.set_client(@client)
57
+ j.set_data(job)
58
+
59
+ @restorejobs.push j
59
60
  end
60
61
  end
61
62
  @restorejobs
62
63
  end
63
64
 
65
+ # @param [String] point_in_time
66
+ # @return [Array<MMS::Resource::RestoreJob>]
64
67
  def create_restorejob(point_in_time = nil)
65
68
  data = {
66
69
  'timestamp' => {
@@ -68,7 +71,7 @@ module MMS
68
71
  'increment' => 0
69
72
  }
70
73
  }
71
- jobs = @client.post('/groups/' + @group.id + '/clusters/' + @id + '/restoreJobs', data)
74
+ jobs = @client.post('/groups/' + group.id + '/clusters/' + @id + '/restoreJobs', data)
72
75
 
73
76
  if jobs.nil?
74
77
  raise MMS::ResourceError.new("Cannot create job from snapshot `#{self.id}`", self)
@@ -102,7 +105,7 @@ module MMS
102
105
  end
103
106
 
104
107
  def table_row
105
- [@group.name, @name, @shard_name, @replicaset_name, @type_name, @last_heartbeat, @id]
108
+ [group.name, @name, @shard_name, @replicaset_name, @type_name, @last_heartbeat, @id]
106
109
  end
107
110
 
108
111
  def table_section
@@ -113,12 +116,12 @@ module MMS
113
116
  ['Group', 'Cluster', 'Shard name', 'Replica name', 'Type', 'Last heartbeat', 'Cluster Id']
114
117
  end
115
118
 
116
- private
117
-
118
- def _load(id)
119
- @client.get('/groups/' + @group.id + '/clusters/' + id.to_s)
119
+ def self._find(client, group_id, id)
120
+ client.get('/groups/' + group_id + '/clusters/' + id)
120
121
  end
121
122
 
123
+ private
124
+
122
125
  def _from_hash(data)
123
126
  @name = data['clusterName']
124
127
  @shard_name = data['shardName']
@@ -10,69 +10,79 @@ module MMS
10
10
 
11
11
  attr_accessor :clusters
12
12
 
13
- @client = nil
14
-
15
- def initialize(client, data)
16
- id = data['id']
17
-
18
- raise MMS::ResourceError.new('`Id` for group resource must be defined', self) if id.nil?
19
-
20
- @client = client
21
-
13
+ def initialize
22
14
  @clusters = []
23
-
24
- super id, data
25
- end
26
-
27
- def self.findGroups(client)
28
- group_list = []
29
- client.get('/groups').each do |group|
30
- group_list.push MMS::Resource::Group.new(client, group)
31
- end
32
- group_list
33
15
  end
34
16
 
35
- def hosts(page = 1, limit = 10)
17
+ # @param [Integer] page
18
+ # @param [Integer] limit
19
+ # @return [Array<MMS::Resource::Host>]
20
+ def hosts(page = 1, limit = 1000)
36
21
  host_list = []
37
22
  @client.get('/groups/' + @id + '/hosts?pageNum=' + page.to_s + '&itemsPerPage=' + limit.to_s).each do |host|
38
- host_list.push MMS::Resource::Host.new(@client, host)
23
+ h = MMS::Resource::Host.new
24
+ h.set_client(@client)
25
+ h.set_data(host)
26
+
27
+ host_list.push h
39
28
  end
40
29
  host_list
41
30
  end
42
31
 
43
- def alerts(page = 1, limit = 10, status = 'OPEN')
32
+ # @param [Integer] page
33
+ # @param [Integer] limit
34
+ # @param [String] status
35
+ # @return [Array<MMS::Resource::Alert>]
36
+ def alerts(page = 1, limit = 1000, status = 'OPEN')
44
37
  alert_list = []
45
38
  @client.get('/groups/' + @id + '/alerts?status=' + status + '&pageNum=' + page.to_s + '&itemsPerPage=' + limit.to_s).each do |alert|
46
- alert_list.push MMS::Resource::Alert.new(@client, alert)
39
+ a = MMS::Resource::Alert.new
40
+ a.set_client(@client)
41
+ a.set_group(self)
42
+ a.set_data(data)
43
+
44
+ alert_list.push a
47
45
  end
48
46
  alert_list
49
47
  end
50
48
 
49
+ # @param [String] id
50
+ # @return [MMS::Resource::Alert]
51
51
  def alert(id)
52
- MMS::Resource::Alert.new(@client, {'id' => id, 'groupId' => @id})
52
+ MMS::Resource::Alert.find(@client, @id, id)
53
53
  end
54
54
 
55
- def clusters(page = 1, limit = 10)
55
+ # @param [Integer] page
56
+ # @param [Integer] limit
57
+ # @return [Array<MMS::Resource::Cluster>]
58
+ def clusters(page = 1, limit = 1000)
56
59
  if @clusters.empty?
57
60
  @client.get('/groups/' + @id + '/clusters?pageNum=' + page.to_s + '&itemsPerPage=' + limit.to_s).each do |cluster|
58
- @clusters.push MMS::Resource::Cluster.new(@client, cluster)
61
+ c = MMS::Resource::Cluster.new
62
+ c.set_client(@client)
63
+ c.set_data(cluster)
64
+ @clusters.push c
59
65
  end
60
66
  end
61
67
  @clusters
62
68
  end
63
69
 
70
+ # @param [String] id
71
+ # @return [MMS::Resource::Cluster]
64
72
  def cluster(id)
65
- MMS::Resource::Cluster.new(@client, {'id' => id, 'groupId' => @id})
73
+ MMS::Resource::Cluster.find(@client, @id, id)
66
74
  end
67
75
 
68
- def findSnapshot(id)
76
+ # @param [String] id
77
+ # @return [MMS::Resource::Snapshot]
78
+ def find_snapshot(id)
69
79
  snapshot = nil
70
80
  clusters.each do |cluster|
71
81
  begin
72
82
  snapshot = cluster.snapshot(id)
73
83
  rescue => e
74
- # cannot load snapshotId for cluster if config-server is the source?
75
- # not supported in current MMS API version
84
+ # STDERR.puts 'cannot load snapshotId for cluster if config-server is the source!'
85
+ # STDERR.puts 'not supported in current MMS API version'
76
86
  end
77
87
  end
78
88
  snapshot
@@ -90,12 +100,12 @@ module MMS
90
100
  ['Name', 'Active Agents', 'Replicas count', 'Shards count', 'Last Active Agent', 'GroupId']
91
101
  end
92
102
 
93
- private
94
-
95
- def _load(id)
96
- @client.get('/groups/' + id.to_s)
103
+ def self._find(client, id)
104
+ client.get('/groups/' + id)
97
105
  end
98
106
 
107
+ private
108
+
99
109
  def _from_hash(data)
100
110
  @name = data['name']
101
111
  @active_agent_count = data['activeAgentCount']
@@ -107,6 +117,5 @@ module MMS
107
117
  def _to_hash
108
118
  @data
109
119
  end
110
-
111
120
  end
112
121
  end
@@ -2,10 +2,7 @@ module MMS
2
2
 
3
3
  class Resource::Host < Resource
4
4
 
5
- @client = nil
6
-
7
5
  attr_accessor :name
8
- attr_accessor :group
9
6
  attr_accessor :hostname
10
7
  attr_accessor :port
11
8
  attr_accessor :type_name
@@ -20,22 +17,13 @@ module MMS
20
17
  attr_accessor :profiler_enabled
21
18
  attr_accessor :logs_enabled
22
19
 
23
- def initialize(client, data)
24
- id = data['id']
25
- group_id = data['groupId']
26
-
27
- raise MMS::ResourceError.new('`Id` for host resource must be defined', self) if id.nil?
28
- raise MMS::ResourceError.new('`groupId` for host resource must be defined', self) if group_id.nil?
29
-
30
- @client = client
31
-
32
- @group = MMS::Resource::Group.new(client, {'id' => group_id})
33
-
34
- super id, data
20
+ # @return [MMS::Resource::Group]
21
+ def group
22
+ MMS::Resource::Group.find(@client, @data['groupId'])
35
23
  end
36
24
 
37
25
  def table_row
38
- [@group.name, @type_name, @name, @ip_address, @port, @last_ping, @alerts_enabled, @id, @shard_name, @replicaset_name]
26
+ [group.name, @type_name, @name, @ip_address, @port, @last_ping, @alerts_enabled, @id, @shard_name, @replicaset_name]
39
27
  end
40
28
 
41
29
  def table_section
@@ -46,12 +34,15 @@ module MMS
46
34
  ['Group', 'Type', 'Hostname', 'IP', 'Port', 'Last ping', 'Alerts enabled', 'HostId', 'Shard', 'Replica']
47
35
  end
48
36
 
49
- private
50
-
51
- def _load(id)
52
- @client.get '/groups/' + @group.id + '/hosts/' + id.to_s
37
+ # @param [MMS::Client] client
38
+ # @param [String] group_id
39
+ # @param [String] id
40
+ def self._find(client, group_id, id)
41
+ client.get('/groups/' + group_id + '/hosts/' + id)
53
42
  end
54
43
 
44
+ private
45
+
55
46
  def _from_hash(data)
56
47
  @hostname = data['hostname']
57
48
  @port = data['port']
@@ -4,13 +4,8 @@ module MMS
4
4
 
5
5
  class Resource::RestoreJob < Resource
6
6
 
7
- @client = nil
8
-
9
7
  attr_accessor :name
10
8
 
11
- # this is restore point cluster e.g full cluster (configs, replicas)
12
- attr_accessor :cluster
13
-
14
9
  # this is source point from where RestoreJob was created
15
10
  # RestoreJob.snapshot.cluster is e.g replica, config server
16
11
  # RestoreJob.cluster is full cluster group (configs, replicas)
@@ -25,22 +20,22 @@ module MMS
25
20
  attr_accessor :delivery_status_name
26
21
  attr_accessor :delivery_url
27
22
 
28
- def initialize(client, data)
29
- id = data['id']
30
- cluster_id = data['clusterId']
31
- group_id = data['groupId']
32
-
33
- raise MMS::ResourceError.new('`Id` for restorejob resource must be defined', self) if id.nil?
34
- raise MMS::ResourceError.new('`clusterId` for restorejob resource must be defined', self) if cluster_id.nil?
35
- raise MMS::ResourceError.new('`groupId` for restorejob resource must be defined', self) if group_id.nil?
36
-
37
- @client = client
38
-
39
- @cluster = MMS::Resource::Cluster.new(client, {'id' => cluster_id, 'groupId' => group_id})
40
-
41
- super id, data
23
+ # @return [MMS::Resource::Cluster]
24
+ def cluster
25
+ begin
26
+ cluster = MMS::Resource::Cluster.find(@client, @data['groupId'], @data['clusterId'])
27
+ rescue
28
+ # Workaround
29
+ # time to time the mms-api return data without "clusterId" defined
30
+ # creation of empty clluster instance is a good solution here.
31
+ cluster = MMS::Resource::Cluster.new
32
+ cluster.set_client(@client)
33
+ cluster.set_data({'groupId' => @data['groupId']})
34
+ end
35
+ cluster
42
36
  end
43
37
 
38
+ # @return [TrueClass, FalseClass]
44
39
  def has_cluster
45
40
  # cluster definition for config-server cannot be loaded
46
41
  # as there is no clusterId for this type of group.
@@ -49,11 +44,12 @@ module MMS
49
44
  snapshot != nil
50
45
  end
51
46
 
47
+ # @return [MMS::Resource::Snapshot]
52
48
  def snapshot
53
49
  # snapshot details for config-server cannot be loaded
54
50
  # as there is no clusterId. See also has_cluster()
55
51
  if @snapshot.nil?
56
- @snapshot = @cluster.group.findSnapshot(@snapshot_id)
52
+ @snapshot = cluster.group.find_snapshot(@snapshot_id)
57
53
  end
58
54
  @snapshot
59
55
  end
@@ -66,8 +62,8 @@ module MMS
66
62
  def table_section
67
63
  [
68
64
  table_row,
69
- [@id, "#{@cluster.name} (#{@cluster.id})", {:value => '', :colspan => 5}],
70
- ['', @cluster.group.name, {:value => '', :colspan => 5}],
65
+ [@id, "#{cluster.name} (#{cluster.id})", {:value => '', :colspan => 5}],
66
+ ['', cluster.group.name, {:value => '', :colspan => 5}],
71
67
  [{:value => 'download url:', :colspan => 7}],
72
68
  [{:value => @delivery_url || '(waiting for link)', :colspan => 7}],
73
69
  :separator
@@ -78,20 +74,21 @@ module MMS
78
74
  ['Timestamp / RestoreId', 'SnapshotId / Cluster / Group', 'Name (created)', 'Status', 'Point in time', 'Delivery', 'Restore status']
79
75
  end
80
76
 
81
- private
77
+ # @return [Hash, NilClass]
78
+ def self.find_recursively(client, group_id, cluster_id, id)
79
+ cluster = MMS::Resource::Cluster.find(client, group_id, cluster_id)
80
+ # config server has no cluster but owns RestoreJob and Snapshot
81
+ restore_jobs = cluster.restorejobs
82
+ job = restore_jobs.select { |restorejob| restorejob.id == id }
83
+ job.first.data unless job.nil? and job.empty?
84
+ end
82
85
 
83
- def _load(id)
84
- if has_cluster
85
- data = @client.get '/groups/' + snapshot.cluster.group.id + '/clusters/' + snapshot.cluster.id + '/restoreJobs/' + id.to_s
86
- else
87
- # config server has no cluster but owns RestoreJob and Snapshot
88
- restore_jobs = @cluster.restorejobs
89
- job = restore_jobs.select { |restorejob| restorejob.id == id }
90
- data = job.first.data unless job.nil? and job.empty?
91
- end
92
- data
86
+ def self._find(client, group_id, cluster_id, id)
87
+ client.get('/groups/' + group_id + '/clusters/' + cluster_id + '/restoreJobs/' + id)
93
88
  end
94
89
 
90
+ private
91
+
95
92
  def _from_hash(data)
96
93
  @snapshot_id = data['snapshotId']
97
94
  @created = data['created']
@@ -107,6 +104,5 @@ module MMS
107
104
  def _to_hash
108
105
  @data
109
106
  end
110
-
111
107
  end
112
108
  end
@@ -4,10 +4,7 @@ module MMS
4
4
 
5
5
  class Resource::Snapshot < Resource
6
6
 
7
- @client = nil
8
-
9
7
  attr_accessor :name
10
- attr_accessor :cluster
11
8
 
12
9
  attr_accessor :complete
13
10
  attr_accessor :created_date
@@ -15,46 +12,37 @@ module MMS
15
12
  attr_accessor :expires
16
13
  attr_accessor :parts
17
14
 
18
- def initialize(client, data)
19
- id = data['id']
20
- cluster_id = data['clusterId']
21
- group_id = data['groupId']
22
-
23
- raise MMS::ResourceError.new('`Id` for restorejob resource must be defined', self) if id.nil?
24
- raise MMS::ResourceError.new('`clusterId` for restorejob resource must be defined', self) if cluster_id.nil?
25
- raise MMS::ResourceError.new('`groupId` for restorejob resource must be defined', self) if group_id.nil?
26
-
27
- @client = client
28
-
29
- @cluster = MMS::Resource::Cluster.new(client, {'id' => cluster_id, 'groupId' => group_id})
30
-
31
- super id, data
32
- end
33
-
15
+ # @return [TrueClass, FalseClass]
34
16
  def is_cluster
35
17
  @parts.length > 1
36
18
  end
37
19
 
20
+ # @return [TrueClass, FalseClass]
38
21
  def is_config
39
22
  @parts.length == 1 and @parts.first['typeName'] == 'CONFIG_SERVER'
40
23
  end
41
24
 
25
+ # @return [TrueClass, FalseClass]
42
26
  def is_replica
43
27
  @parts.length == 1 and @parts.first['typeName'] == 'REPLICA_SET'
44
28
  end
45
29
 
30
+ # @return [String, NilClass]
46
31
  def cluster_name
47
- @cluster.name if is_cluster
32
+ cluster.name if is_cluster
48
33
  end
49
34
 
35
+ # @return [String, NilClass]
50
36
  def config_name
51
37
  'config' if is_config
52
38
  end
53
39
 
40
+ # @return [String, NilClass]
54
41
  def replica_name
55
42
  @parts.first['replicaSetName'] if is_replica
56
43
  end
57
44
 
45
+ # @return [String, NilClass]
58
46
  def source_name
59
47
  name = nil
60
48
  name = replica_name if is_replica
@@ -63,9 +51,15 @@ module MMS
63
51
  name
64
52
  end
65
53
 
54
+ # @return [MMS::Resource::Cluster]
55
+ def cluster
56
+ MMS::Resource::Cluster.find(@client, @data['groupId'], @data['clusterId'])
57
+ end
58
+
59
+ # @return [Array<MMS::Resource::RestoreJob>]
66
60
  def create_restorejob
67
61
  data = {:snapshotId => @id}
68
- jobs = @client.post '/groups/' + @cluster.group.id + '/clusters/' + @cluster.id + '/restoreJobs', data
62
+ jobs = @client.post '/groups/' + cluster.group.id + '/clusters/' + cluster.id + '/restoreJobs', data
69
63
 
70
64
  if jobs.nil?
71
65
  raise MMS::ResourceError.new("Cannot create job from snapshot `#{self.id}`", self)
@@ -74,7 +68,7 @@ module MMS
74
68
  job_list = []
75
69
  # work around due to bug in MMS API; cannot read restoreJob using provided info.
76
70
  # The config-server RestoreJob and Snapshot has no own ClusterId to be accessed.
77
- restore_jobs = @cluster.restorejobs
71
+ restore_jobs = cluster.restorejobs
78
72
  jobs.each do |job|
79
73
  _list = restore_jobs.select { |restorejob| restorejob.id == job['id'] }
80
74
  _list.each do |restorejob|
@@ -85,7 +79,7 @@ module MMS
85
79
  end
86
80
 
87
81
  def table_row
88
- [@cluster.group.name, @cluster.name, @id, @complete, @created_increment, @name, @expires]
82
+ [cluster.group.name, cluster.name, @id, @complete, @created_increment, @name, @expires]
89
83
  end
90
84
 
91
85
  def table_section
@@ -106,12 +100,17 @@ module MMS
106
100
  ['Group', 'Cluster', 'SnapshotId', 'Complete', 'Created increment', 'Name (created date)', 'Expires']
107
101
  end
108
102
 
109
- private
110
-
111
- def _load(id)
112
- @client.get '/groups/' + @cluster.group.id + '/clusters/' + @cluster.id + '/snapshots/' + id.to_s
103
+ # @param [MMS::Client] client
104
+ # @param [String] group_id
105
+ # @param [String] cluster_id
106
+ # @param [String] id
107
+ # @return [MMS::Resource::Snapshot]
108
+ def self._find(client, group_id, cluster_id, id)
109
+ client.get('/groups/' + group_id + '/clusters/' + cluster_id + '/snapshots/' + id.to_s)
113
110
  end
114
111
 
112
+ private
113
+
115
114
  def _from_hash(data)
116
115
  @complete = data['complete']
117
116
  @created_date = data['created'].nil? ? nil : data['created']['date']
@@ -119,8 +118,6 @@ module MMS
119
118
  @expires = data['expires']
120
119
  @parts = data['parts']
121
120
  @name = @created_date.nil? ? @id : DateTime.parse(@created_date).strftime("%Y-%m-%d %H:%M:%S")
122
-
123
- @cluster = MMS::Resource::Cluster.new(@client, {'id' => data['clusterId'], 'groupId' => data['groupId']})
124
121
  end
125
122
 
126
123
  def _to_hash
@@ -0,0 +1,60 @@
1
+ module MMS
2
+
3
+ class Resource::SnapshotSchedule < Resource
4
+
5
+ attr_accessor :name
6
+
7
+ attr_accessor :snapshot_interval_hours
8
+ attr_accessor :snapshot_retention_days
9
+ attr_accessor :cluster_checkpoint_interval_min
10
+ attr_accessor :daily_snapshot_retention_days
11
+ attr_accessor :weekly_snapshot_retention_weeks
12
+ attr_accessor :monthly_snapshot_retention_months
13
+
14
+ # @return [MMS::Resource::Cluster]
15
+ def cluster
16
+ MMS::Resource::Cluster.find(@client, @data['groupId'], @data['clusterId'])
17
+ end
18
+
19
+ def table_row
20
+ [
21
+ cluster.group.name,
22
+ cluster.name,
23
+ @snapshot_interval_hours,
24
+ @snapshot_retention_days,
25
+ @cluster_checkpoint_interval_min,
26
+ @daily_snapshot_retention_days,
27
+ @weekly_snapshot_retention_weeks,
28
+ @monthly_snapshot_retention_months,
29
+ ]
30
+ end
31
+
32
+ def table_section
33
+ [table_row]
34
+ end
35
+
36
+ def self.table_header
37
+ ['Group', 'Cluster', 'IntervalHours', 'RetentionDays', 'CheckpointIntervalMin', 'RetentionDays', 'RetentionWeeks', 'RetentionMonths']
38
+ end
39
+
40
+ def self._find(client, group_id, cluster_id)
41
+ client.get('/groups/' + group_id + '/backupConfigs/' + cluster_id + '/snapshotSchedule')
42
+ end
43
+
44
+ private
45
+
46
+ def _from_hash(data)
47
+ @snapshot_interval_hours = data['snapshotIntervalHours']
48
+ @snapshot_retention_days = data['snapshotRetentionDays']
49
+ @cluster_checkpoint_interval_min = data['clusterCheckpointIntervalMin']
50
+ @daily_snapshot_retention_days = data['dailySnapshotRetentionDays']
51
+ @weekly_snapshot_retention_weeks = data['weeklySnapshotRetentionWeeks']
52
+ @monthly_snapshot_retention_months = data['monthlySnapshotRetentionMonths']
53
+ end
54
+
55
+ def _to_hash
56
+ @data
57
+ end
58
+
59
+ end
60
+ end
@@ -1,3 +1,3 @@
1
1
  module MMS
2
- VERSION = '0.0.10'
2
+ VERSION = '0.1.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mms-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cargo Media
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-02-06 00:00:00.000000000 Z
13
+ date: 2015-02-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: net-http-digest_auth
@@ -120,6 +120,7 @@ files:
120
120
  - lib/mms/resource/host.rb
121
121
  - lib/mms/resource/restore_job.rb
122
122
  - lib/mms/resource/snapshot.rb
123
+ - lib/mms/resource/snapshot_schedule.rb
123
124
  - lib/mms/version.rb
124
125
  homepage: https://github.com/cargomedia/mms-api
125
126
  licenses:
@@ -146,3 +147,4 @@ signing_key:
146
147
  specification_version: 4
147
148
  summary: MongoDB MMS API client
148
149
  test_files: []
150
+ has_rdoc: