mms-api 0.1.0 → 0.1.1
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.
- checksums.yaml +4 -4
- data/README.md +76 -30
- data/lib/mms/resource.rb +17 -3
- data/lib/mms/resource/cluster.rb +13 -36
- data/lib/mms/resource/group.rb +4 -4
- data/lib/mms/resource/restore_job.rb +28 -42
- data/lib/mms/resource/snapshot.rb +11 -14
- data/lib/mms/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f46973360a5bc90648f5db16ed68f2a715df24f
|
4
|
+
data.tar.gz: 87a3cdbe52ea77dd5b1778d8df9318a2b34734e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34e98f586c2a03de4ea3260a11f22fba361e93407de77f740f0f12b5c2a79144befb8ed1343ccff7143f3fed09238fd048c4415d7915a69115bb14ca4be823b1
|
7
|
+
data.tar.gz: 2cbf2343574237b3814aae43a47815591d0b5cf773da2555ceb08271b4836cb50442c437b1a38b9a5af6f76b1589b6be88e73d7c92bc4abfb61eea1a7f26b2e5
|
data/README.md
CHANGED
@@ -12,35 +12,91 @@ API coverage
|
|
12
12
|
------------
|
13
13
|
The MMS Public API follows the principles of the REST architectural style to expose a number of internal resources which enable programmatic access to [MMS’s features](http://mms.mongodb.com/help/reference/api/). Current implementation support only a few of API features.
|
14
14
|
|
15
|
-
|Resource|Get All|Get One|Create|Update|Delete|
|
16
|
-
|
17
|
-
|Groups| +
|
18
|
-
|Hosts| +
|
19
|
-
|Clusters| +
|
20
|
-
|Snapshots| +
|
21
|
-
|Alerts| +
|
22
|
-
|Restore Jobs| +
|
23
|
-
|
24
|
-
|
25
|
-
|
15
|
+
|Resource |Get All |Get One |Create |Update |Delete |
|
16
|
+
|:------------|:------:|:------:|:-----:|:-----:|:-----:|
|
17
|
+
|Groups | + | + | | | |
|
18
|
+
|Hosts | + | + | | | |
|
19
|
+
|Clusters | + | + | | | |
|
20
|
+
|Snapshots | + | + | | | |
|
21
|
+
|Alerts | + | + | | | |
|
22
|
+
|Restore Jobs | + | + | + | | |
|
23
|
+
|
24
|
+
Library usage
|
25
|
+
-------------
|
26
|
+
|
27
|
+
Source code itself is well-documented so when writing code it should auto-complete and hint in all supported usages.
|
28
|
+
|
29
|
+
|
30
|
+
### Client
|
31
|
+
Most important part of the api is client. In order to make any request you need to instantiate client with correct params.
|
32
|
+
|
26
33
|
```ruby
|
27
|
-
|
34
|
+
client = MMS::Client.new('username', 'api_key')
|
28
35
|
```
|
29
36
|
|
30
|
-
|
31
|
-
|
37
|
+
This client is used by all other classes connecting to api no matter if it's Resource or helper class like Agent.
|
38
|
+
|
39
|
+
|
40
|
+
### Agent
|
41
|
+
Agent is simple wrapper class for listing all accessible resources.
|
42
|
+
|
32
43
|
```ruby
|
33
|
-
client = MMS::Client.new(
|
44
|
+
client = MMS::Client.new('username', 'api_key')
|
45
|
+
agent = MMS::Agent.new(client)
|
46
|
+
|
47
|
+
agent.alerts.each do |alert|
|
48
|
+
alert.ack('now')
|
49
|
+
end
|
34
50
|
```
|
35
51
|
|
36
|
-
|
37
|
-
|
52
|
+
List of resource-listing agent methods:
|
53
|
+
- groups
|
54
|
+
- hosts
|
55
|
+
- clusters
|
56
|
+
- snapshots
|
57
|
+
- alerts
|
58
|
+
- restorejobs
|
59
|
+
|
60
|
+
### Resources
|
61
|
+
|
62
|
+
You can find lists of resource by using agent as pointed above, or by various resource methods.
|
63
|
+
Each resource have a find method loading certain resource with provided id (plus corresponding parent ids), e.g.
|
38
64
|
```ruby
|
39
|
-
|
65
|
+
client = new MMS::Client.new('username', 'api_key')
|
66
|
+
host = MMS::Resource::Host.find(client, 'group_id', 'host_id')
|
67
|
+
```
|
68
|
+
|
69
|
+
Additionally some resources have additional instance methods to retrieve sub-resources, e.g.
|
70
|
+
```ruby
|
71
|
+
client = new MMS::Client.new('username', 'api_key')
|
72
|
+
group = MMS::Resource::Group.find(client, 'group_id')
|
73
|
+
hosts = group.hosts
|
74
|
+
```
|
75
|
+
|
76
|
+
Cli usage
|
77
|
+
---------
|
78
|
+
|
79
|
+
There is a built-in cli with several commands retrieving api resource lists.
|
80
|
+
|
81
|
+
### Configuration
|
82
|
+
|
83
|
+
Cli uses configuration with all values set to default ones.
|
84
|
+
Config itself has `config_file` property which merges itself with params from the file.
|
85
|
+
By default `config_file` points to home directory, but it can be changed to points to any file.
|
86
|
+
|
87
|
+
```
|
88
|
+
username=sysadmin@example.tld
|
89
|
+
apikey=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
90
|
+
apiurl=https://mms.mydomain.tld/api/public/v1.0
|
91
|
+
default_group_id=your-group-id
|
92
|
+
default_cluster_id=your-cluster-id
|
40
93
|
```
|
41
94
|
|
42
|
-
|
43
|
-
|
95
|
+
Additionally some options can be modified using cli options.
|
96
|
+
|
97
|
+
### Available commands
|
98
|
+
|
99
|
+
|
44
100
|
```bash
|
45
101
|
$ mms-api --help
|
46
102
|
Usage:
|
@@ -71,13 +127,3 @@ Options:
|
|
71
127
|
-j, --json Print JSON output (default: false)
|
72
128
|
-l, --limit <integer> Limit for result items
|
73
129
|
```
|
74
|
-
|
75
|
-
`mms-api` reads default configuration from your home directory `~/.mms-api`. Example configuration:
|
76
|
-
|
77
|
-
```
|
78
|
-
username=sysadmin@example.tld
|
79
|
-
apikey=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
80
|
-
# apiurl=https://mms.mydomain.tld/api/public/v1.0
|
81
|
-
default_group_id=your-group-id
|
82
|
-
default_cluster_id=your-cluster-id
|
83
|
-
```
|
data/lib/mms/resource.rb
CHANGED
@@ -16,8 +16,7 @@ module MMS
|
|
16
16
|
def set_data(data)
|
17
17
|
@data = data
|
18
18
|
from_hash(data)
|
19
|
-
|
20
|
-
MMS::Cache.instance.set(cache_key, data)
|
19
|
+
MMS::Cache.instance.set(cache_key(@id), data)
|
21
20
|
end
|
22
21
|
|
23
22
|
# @param [Hash] data
|
@@ -61,11 +60,15 @@ module MMS
|
|
61
60
|
raise("`#{__method__}` is not implemented for `#{self.class.name}`")
|
62
61
|
end
|
63
62
|
|
63
|
+
def invalidate_cache
|
64
|
+
MMS::Cache.instance.delete(cache_key(@id))
|
65
|
+
end
|
66
|
+
|
64
67
|
# @param [MMS::Client] client
|
65
68
|
# @param arguments...
|
66
69
|
# @return self
|
67
70
|
def self.find(client, *arguments)
|
68
|
-
cache_key =
|
71
|
+
cache_key = self.cache_key(arguments.last())
|
69
72
|
data = MMS::Cache.instance.get(cache_key)
|
70
73
|
unless data
|
71
74
|
data = self._find(client, *arguments)
|
@@ -76,5 +79,16 @@ module MMS
|
|
76
79
|
resource.set_data(data)
|
77
80
|
resource
|
78
81
|
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def cache_key(id)
|
86
|
+
"Class::#{self.class.name}:#{id}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.cache_key(id)
|
90
|
+
"Class::#{self.name}:#{id}"
|
91
|
+
end
|
92
|
+
|
79
93
|
end
|
80
94
|
end
|
data/lib/mms/resource/cluster.rb
CHANGED
@@ -45,12 +45,8 @@ module MMS
|
|
45
45
|
if @restorejobs.empty?
|
46
46
|
@client.get('/groups/' + group.id + '/clusters/' + @id + '/restoreJobs?pageNum=' + page.to_s + '&itemsPerPage=' + limit.to_s).each do |job|
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
elsif job['clusterId'].nil?
|
51
|
-
snapshot = group.find_snapshot(job['snapshotId'])
|
52
|
-
job['clusterId'] = snapshot.cluster.id unless snapshot.nil?
|
53
|
-
end
|
48
|
+
job['clusterId'] = @id
|
49
|
+
job['groupId'] = group.id
|
54
50
|
|
55
51
|
j = MMS::Resource::RestoreJob.new
|
56
52
|
j.set_client(@client)
|
@@ -66,42 +62,23 @@ module MMS
|
|
66
62
|
# @return [Array<MMS::Resource::RestoreJob>]
|
67
63
|
def create_restorejob(point_in_time = nil)
|
68
64
|
data = {
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
65
|
+
'timestamp' => {
|
66
|
+
'date' => point_in_time,
|
67
|
+
'increment' => 0
|
68
|
+
}
|
73
69
|
}
|
74
|
-
|
70
|
+
job_data_list = @client.post('/groups/' + group.id + '/clusters/' + @id + '/restoreJobs', data)
|
75
71
|
|
76
|
-
if
|
72
|
+
if job_data_list.nil?
|
77
73
|
raise MMS::ResourceError.new("Cannot create job from snapshot `#{self.id}`", self)
|
78
74
|
end
|
79
75
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
begin
|
86
|
-
restore_jobs = restorejobs
|
87
|
-
tries = 0
|
88
|
-
rescue Exception => e
|
89
|
-
tries-=1;
|
90
|
-
raise MMS::ResourceError.new(e.message, self) if tries < 1
|
91
|
-
|
92
|
-
STDERR.puts e.message
|
93
|
-
STDERR.puts 'Sleeping for 5 seconds. Trying again...'
|
94
|
-
sleep(5)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
jobs.each do |job|
|
99
|
-
_list = restore_jobs.select { |restorejob| restorejob.id == job['id'] }
|
100
|
-
_list.each do |restorejob|
|
101
|
-
job_list.push restorejob
|
102
|
-
end
|
76
|
+
job_data_list.map do |job_data|
|
77
|
+
j = MMS::Resource::RestoreJob.new
|
78
|
+
j.set_client(@client)
|
79
|
+
j.set_data(job_data)
|
80
|
+
j
|
103
81
|
end
|
104
|
-
job_list
|
105
82
|
end
|
106
83
|
|
107
84
|
def table_row
|
data/lib/mms/resource/group.rb
CHANGED
@@ -74,15 +74,15 @@ module MMS
|
|
74
74
|
end
|
75
75
|
|
76
76
|
# @param [String] id
|
77
|
-
# @return [MMS::Resource::Snapshot]
|
77
|
+
# @return [MMS::Resource::Snapshot, NilClass]
|
78
78
|
def find_snapshot(id)
|
79
79
|
snapshot = nil
|
80
80
|
clusters.each do |cluster|
|
81
81
|
begin
|
82
82
|
snapshot = cluster.snapshot(id)
|
83
|
-
|
84
|
-
|
85
|
-
#
|
83
|
+
break unless snapshot.nil?
|
84
|
+
rescue MMS::ApiError => e
|
85
|
+
# Snapshot is not available on this cluster. Skip it!
|
86
86
|
end
|
87
87
|
end
|
88
88
|
snapshot
|
@@ -20,38 +20,17 @@ module MMS
|
|
20
20
|
attr_accessor :delivery_status_name
|
21
21
|
attr_accessor :delivery_url
|
22
22
|
|
23
|
+
attr_accessor :cluster_id
|
24
|
+
attr_accessor :group_id
|
25
|
+
|
23
26
|
# @return [MMS::Resource::Cluster]
|
24
27
|
def cluster
|
25
|
-
|
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
|
28
|
+
MMS::Resource::Cluster.find(@client, @group_id, @cluster_id)
|
36
29
|
end
|
37
30
|
|
38
|
-
# @return [
|
39
|
-
def has_cluster
|
40
|
-
# cluster definition for config-server cannot be loaded
|
41
|
-
# as there is no clusterId for this type of group.
|
42
|
-
# there is snapshotId for RestoreJob but seems to be stored
|
43
|
-
# internally in MMS API. Not accessible by public API.
|
44
|
-
snapshot != nil
|
45
|
-
end
|
46
|
-
|
47
|
-
# @return [MMS::Resource::Snapshot]
|
31
|
+
# @return [MMS::Resource::Snapshot, NilClass]
|
48
32
|
def snapshot
|
49
|
-
|
50
|
-
# as there is no clusterId. See also has_cluster()
|
51
|
-
if @snapshot.nil?
|
52
|
-
@snapshot = cluster.group.find_snapshot(@snapshot_id)
|
53
|
-
end
|
54
|
-
@snapshot
|
33
|
+
@snapshot ||= cluster.group.find_snapshot(@snapshot_id)
|
55
34
|
end
|
56
35
|
|
57
36
|
def table_row
|
@@ -61,12 +40,12 @@ module MMS
|
|
61
40
|
|
62
41
|
def table_section
|
63
42
|
[
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
43
|
+
table_row,
|
44
|
+
[@id, "#{cluster.name} (#{cluster.id})", {:value => '', :colspan => 5}],
|
45
|
+
['', cluster.group.name, {:value => '', :colspan => 5}],
|
46
|
+
[{:value => 'download url:', :colspan => 7}],
|
47
|
+
[{:value => @delivery_url || '(waiting for link)', :colspan => 7}],
|
48
|
+
:separator
|
70
49
|
]
|
71
50
|
end
|
72
51
|
|
@@ -74,17 +53,22 @@ module MMS
|
|
74
53
|
['Timestamp / RestoreId', 'SnapshotId / Cluster / Group', 'Name (created)', 'Status', 'Point in time', 'Delivery', 'Restore status']
|
75
54
|
end
|
76
55
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
56
|
+
def self._find(client, group_id, cluster_id, id)
|
57
|
+
begin
|
58
|
+
client.get('/groups/' + group_id + '/clusters/' + cluster_id + '/restoreJobs/' + id)
|
59
|
+
rescue MMS::ApiError => e
|
60
|
+
# workaround for https://jira.mongodb.org/browse/DOCS-5017
|
61
|
+
self._find_from_list(client, group_id, cluster_id, id)
|
62
|
+
end
|
84
63
|
end
|
85
64
|
|
86
|
-
def self.
|
87
|
-
|
65
|
+
def self._find_from_list(client, group_id, cluster_id, id)
|
66
|
+
cluster = MMS::Resource::Cluster.find(client, group_id, cluster_id)
|
67
|
+
|
68
|
+
job = cluster.restorejobs.find { |restorejob| restorejob.id == id }
|
69
|
+
raise("Cannot find RestoreJob id `#{id}`") if job.nil?
|
70
|
+
|
71
|
+
job.data
|
88
72
|
end
|
89
73
|
|
90
74
|
private
|
@@ -99,6 +83,8 @@ module MMS
|
|
99
83
|
@delivery_status_name = data['delivery']['statusName'] unless data['delivery'].nil?
|
100
84
|
@delivery_url = data['delivery']['url'] unless data['delivery'].nil?
|
101
85
|
@name = DateTime.parse(@created).strftime("%Y-%m-%d %H:%M:%S")
|
86
|
+
@cluster_id = data['clusterId']
|
87
|
+
@group_id = data['groupId']
|
102
88
|
end
|
103
89
|
|
104
90
|
def _to_hash
|
@@ -11,6 +11,7 @@ module MMS
|
|
11
11
|
attr_accessor :created_increment
|
12
12
|
attr_accessor :expires
|
13
13
|
attr_accessor :parts
|
14
|
+
attr_accessor :is_possibly_inconsistent
|
14
15
|
|
15
16
|
# @return [TrueClass, FalseClass]
|
16
17
|
def is_cluster
|
@@ -59,27 +60,22 @@ module MMS
|
|
59
60
|
# @return [Array<MMS::Resource::RestoreJob>]
|
60
61
|
def create_restorejob
|
61
62
|
data = {:snapshotId => @id}
|
62
|
-
|
63
|
+
job_data_list = @client.post '/groups/' + cluster.group.id + '/clusters/' + cluster.id + '/restoreJobs', data
|
63
64
|
|
64
|
-
if
|
65
|
+
if job_data_list.nil?
|
65
66
|
raise MMS::ResourceError.new("Cannot create job from snapshot `#{self.id}`", self)
|
66
67
|
end
|
67
68
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
_list = restore_jobs.select { |restorejob| restorejob.id == job['id'] }
|
74
|
-
_list.each do |restorejob|
|
75
|
-
job_list.push restorejob
|
76
|
-
end
|
69
|
+
job_data_list.map do |job_data|
|
70
|
+
j = MMS::Resource::RestoreJob.new
|
71
|
+
j.set_client(@client)
|
72
|
+
j.set_data(job_data)
|
73
|
+
j
|
77
74
|
end
|
78
|
-
job_list
|
79
75
|
end
|
80
76
|
|
81
77
|
def table_row
|
82
|
-
[cluster.group.name, cluster.name, @id, @complete, @created_increment, @name, @expires]
|
78
|
+
[cluster.group.name, cluster.name, @id, @complete, @created_increment, @name, @expires, @is_possibly_inconsistent]
|
83
79
|
end
|
84
80
|
|
85
81
|
def table_section
|
@@ -97,7 +93,7 @@ module MMS
|
|
97
93
|
end
|
98
94
|
|
99
95
|
def self.table_header
|
100
|
-
['Group', 'Cluster', 'SnapshotId', 'Complete', 'Created increment', 'Name (created date)', 'Expires']
|
96
|
+
['Group', 'Cluster', 'SnapshotId', 'Complete', 'Created increment', 'Name (created date)', 'Expires', 'Inconsistent']
|
101
97
|
end
|
102
98
|
|
103
99
|
# @param [MMS::Client] client
|
@@ -117,6 +113,7 @@ module MMS
|
|
117
113
|
@created_increment = data['created'].nil? ? nil : data['created']['increment']
|
118
114
|
@expires = data['expires']
|
119
115
|
@parts = data['parts']
|
116
|
+
@is_possibly_inconsistent = data['isPossiblyInconsistent']
|
120
117
|
@name = @created_date.nil? ? @id : DateTime.parse(@created_date).strftime("%Y-%m-%d %H:%M:%S")
|
121
118
|
end
|
122
119
|
|
data/lib/mms/version.rb
CHANGED
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.1.
|
4
|
+
version: 0.1.1
|
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-
|
13
|
+
date: 2015-03-17 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: net-http-digest_auth
|
@@ -142,9 +142,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
142
|
version: '0'
|
143
143
|
requirements: []
|
144
144
|
rubyforge_project:
|
145
|
-
rubygems_version: 2.4.
|
145
|
+
rubygems_version: 2.4.6
|
146
146
|
signing_key:
|
147
147
|
specification_version: 4
|
148
148
|
summary: MongoDB MMS API client
|
149
149
|
test_files: []
|
150
|
-
has_rdoc:
|