mms-api 0.0.9 → 0.0.10

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: 2f84b83712abb35d5ddc92349e7f7edc6ce8ce1d
4
- data.tar.gz: 9402addd71a60272c9c7ec83b615f0dff43807b4
3
+ metadata.gz: 7f238c7242a72f7afcaf801e4471a6a772377b30
4
+ data.tar.gz: b7db404c176c296832c46552d104a7adb8abb899
5
5
  SHA512:
6
- metadata.gz: 0b33d1456eb0dd74586cd4cae98fd2c58f943ce3232a37bf5dbe025c34d907af08cdb78bfa2badf6816bad4a88ddb5958459d658ac87a914e0ebf6cfb45e7e83
7
- data.tar.gz: b06c7b7efc6826286ea196834b8e3bd99c3cabb61526283aaa4f68a1e9dba9c4e543290108af2f2b5239205abe6549a7ca9c26aaa9936360a764e95cbe7018b0
6
+ metadata.gz: b8dca3e5b69c6dc916920e52abffb1d1647f6a59571cbdf0307714564f7a8e43256dbb78ce46bea5d937eca2def867dc92e43d04e2ebd4e3182d2984df680ad8
7
+ data.tar.gz: 98f2a85f55e5f1cf942dda16d2745955745dee3ff52afbcb60d3c3261aa332e1e978d804eafeb16e99c59fd85098468f1c71b1e0e1dcbe6fd5b6824cf78e4b97
data/README.md CHANGED
@@ -8,40 +8,6 @@ Installation
8
8
  gem install mms-api
9
9
  ```
10
10
 
11
- Cli
12
- ---
13
- ```bash
14
- $ mms-api --help
15
- mms-api is a tool for accessing MMS API
16
-
17
- Usage:
18
-
19
- mms-api command [options]
20
-
21
- Commands:
22
-
23
- groups | hosts | clusters | snapshots | restorejobs | restorejobs-create
24
-
25
- Options:
26
-
27
- -u, --username <string> MMS user
28
- -k, --apikey <string> MMS api-key
29
- -a, --apiurl <string> MMS api url. Full url including version: https://mms.mydomain.tld/api/public/v1.0
30
- -n, --name <string> Filter by resource name using regexp
31
- -l, --limit <int> Limit for result items
32
- -v, --version Version
33
- -h, --help Show this help
34
- ```
35
-
36
- `mms-api` reads default configuration from your home directory `~/.mms-api`. Example configuration:
37
-
38
- ```
39
- username=sysadmin@example.tld
40
- apikey=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
41
- # apiurl=https://mms.mydomain.tld/api/public/v1.0
42
- # action=hosts
43
- ```
44
-
45
11
  API coverage
46
12
  ------------
47
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.
@@ -52,39 +18,66 @@ The MMS Public API follows the principles of the REST architectural style to exp
52
18
  |Hosts| + | + | | | | |
53
19
  |Clusters| + | + | | | | |
54
20
  |Snapshots| + | + | | | | |
21
+ |Alerts| + | + | | | | |
55
22
  |Restore Jobs| + | + | + | | | |
56
23
 
24
+ Config
25
+ ------
26
+ ```ruby
27
+ config = MMS::Config.new
28
+ ```
29
+
30
+ Client
31
+ ------
32
+ ```ruby
33
+ client = MMS::Client.new(config.username, config.apikey)
34
+ ```
57
35
 
58
- Example
59
- -------
36
+ Agent
37
+ -----
60
38
  ```ruby
61
- require 'mms'
39
+ agent = MMS::Agent.new(client)
40
+ ```
62
41
 
63
- agent = MMS::Agent.new('username', 'apikey')
42
+ Cli
43
+ ---
44
+ ```bash
45
+ $ mms-api --help
46
+ Usage:
47
+ [OPTIONS] SUBCOMMAND [ARG] ...
64
48
 
65
- # all available resources
66
- group_list = agent.groups
67
- host_list = agent.hosts
68
- cluster_list = agent.clusters
69
- snapshot_list = agent.snapshots
70
- job_list = agent.restorejobs
49
+ Parameters:
50
+ SUBCOMMAND subcommand
51
+ [ARG] ... subcommand arguments
71
52
 
72
- # get first cluster from list
73
- cluster = cluster_list.first
53
+ Subcommands:
54
+ groups Groups
55
+ hosts Hosts
56
+ clusters Clusters
57
+ alerts Alerts
58
+ snapshots Snapshots
59
+ restorejobs Restorejobs
74
60
 
75
- # get list of all restore-jobs for specific cluster
76
- job_list = agent.findGroup(cluster.group.id).cluster(cluster.id).restorejobs
77
- # or simply using cluster instance
78
- job_list = cluster.restorejobs
61
+ Options:
62
+ -h, --help print help
63
+ -u, --username <string> MMS user
64
+ -k, --apikey <string> MMS api-key
65
+ -a, --apiurl <string> MMS api url. Full url including version: https://mms.mydomain.tld/api/public/v1.0
66
+ -v, --version Version
67
+ -g, --default-group-id <string> Default MMS group id
68
+ -c, --default-cluster-id <string> Default MMS cluster id
69
+ --cfg <string> Config file path
70
+ -i, --ignore Ignore flag of --group-id and -cluster-id (default: false)
71
+ -j, --json Print JSON output (default: false)
72
+ -l, --limit <integer> Limit for result items
73
+ ```
79
74
 
80
- # get first snapshot from list
81
- snapshot = snapshot_list.first
75
+ `mms-api` reads default configuration from your home directory `~/.mms-api`. Example configuration:
82
76
 
83
- # create restore job for snapshot
84
- group_id = snapshot.cluster.group.id
85
- cluster_id = snapshot.cluster.id
86
- snapshot_id = snapshot.id
87
- job_list = agent.findGroup(group_id).cluster(cluster_id).snapshot(snapshot_id).create_restorejob
88
- # or simply using snapshot instance
89
- job_list = snapshot.create_restorejob
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
90
83
  ```
@@ -1,151 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
4
-
5
4
  require 'mms'
6
- require 'optparse'
7
- require 'terminal-table'
8
- require 'parseconfig'
9
- require 'pathname'
10
-
11
- actions_available = ["groups", "hosts", "clusters", "snapshots", "restorejobs", "restorejobs-create"]
12
-
13
- app_name = 'mms-api'
14
- app_dscr = "#{app_name} is a tool for accessing MMS API"
15
- app_usage = "#{app_name} command [options]"
16
- app_version = MMS::VERSION
17
- app_commands = "#{actions_available.join(' | ')}"
18
-
19
- config = {}
20
- options = {}
21
-
22
- config_file = Pathname.new(Dir.home) + app_name.prepend('.')
23
- if config_file.exist?
24
- config = ParseConfig.new(config_file)
25
- end
26
-
27
- optparse = OptionParser.new do |opts|
28
- opts.banner = "#{app_dscr}\n\nUsage:\n\n\t#{app_usage}\n\nCommands:\n\n\t#{app_commands}\n\nOptions:\n\n"
29
-
30
- options[:username] = config['username']
31
- opts.on("-u", "--username <string>", "MMS user") do |u|
32
- options[:username] = u
33
- end
34
-
35
- options[:apikey] = config['apikey']
36
- opts.on("-k", "--apikey <string>", "MMS api-key") do |k|
37
- options[:apikey] = k
38
- end
39
-
40
- options[:apiurl] = config['apiurl']
41
- opts.on("-a", "--apiurl <string>", "MMS api url. Full url including version: https://mms.mydomain.tld/api/public/v1.0") do |a|
42
- options[:apiurl] = a
43
- end
44
-
45
- options[:name] = '.*'
46
- opts.on("-n", "--name <string>", "Filter for resource name using regexp") do |n|
47
- options[:name] = n
48
- end
49
-
50
- options[:limit] = config['limit'] || 5
51
- opts.on("-l", "--limit <int>", "Limit for result items") do |l|
52
- options[:limit] = l.to_i
53
- end
54
-
55
- opts.on("-v", "--version", "Version") do |v|
56
- puts "#{app_name} v#{app_version}"
57
- exit
58
- end
59
-
60
- opts.on("-h", "--help", "Show this help") do |h|
61
- puts opts
62
- exit
63
- end
64
- end
65
-
66
- begin
67
- optparse.parse!
68
- if not options[:username]
69
- puts "Missing options: MMS username [-u <string>]"
70
- exit
71
- end
72
- if not options[:apikey]
73
- puts "Missing options: MMS api-key [-k <string>]"
74
- exit
75
- end
76
- rescue OptionParser::InvalidOption, OptionParser::MissingArgument
77
- puts $!.to_s
78
- puts optparse
79
- exit
80
- end
81
-
82
- begin
83
- action = (ARGV.first || config['action'] || '').downcase
84
- raise("Unknown action #{action.upcase}") unless actions_available.include? (action)
85
- rescue => e
86
- puts "Error: #{e.message}"
87
- puts "Available actions: #{(actions_available.join ', ').upcase}"
88
- puts optparse
89
- exit 1
90
- end
91
-
92
- begin
93
- ARGV.shift
94
- agent = MMS::Agent.new(options[:username], options[:apikey])
95
- if options[:apiurl] then
96
- agent.set_apiurl(options[:apiurl])
97
- end
98
-
99
- results = agent.send action.sub('-', '_'), *ARGV
100
- results.select! { |resource| !resource.name.match(Regexp.new(options[:name])).nil? }
101
-
102
- rows = []
103
- case action
104
- when 'groups'
105
- heading = ['Name', 'Active Agents', 'Replicas count', 'Shards count', 'Last Active Agent', 'GroupId']
106
- results.each do |group|
107
- rows << [group.name, group.active_agent_count, group.replicaset_count, group.shard_count, group.last_active_agent, group.id]
108
- end
109
- when 'hosts'
110
- heading = ['Group', 'Type', 'Hostname', 'IP', 'Port', 'Last ping', 'Alerts enabled', 'HostId', 'Shard', 'Replica']
111
- results.each do |host|
112
- rows << [host.group.name, host.type_name, host.name, host.ip_address, host.port, host.last_ping, host.alerts_enabled, host.id, host.shard_name, host.replicaset_name]
113
- end
114
- when 'clusters'
115
- heading = ['Group', 'Cluster', 'Shard name', 'Replica name', 'Type', 'Last heartbeat', 'Cluster Id']
116
- results.each do |cluster|
117
- rows << [cluster.group.name, cluster.name, cluster.shard_name, cluster.replicaset_name, cluster.type_name, cluster.last_heartbeat, cluster.id]
118
- end
119
- when 'snapshots'
120
- heading = ['Group', 'Cluster', 'SnapshotId', 'Complete', 'Created increment', 'Name (created date)', 'Expires']
121
- results_sorted = results.sort_by { |snapshot| snapshot.created_date }.reverse
122
- results_sorted.first(options[:limit]).each do |snapshot|
123
- rows << [snapshot.cluster.group.name, snapshot.cluster.name, snapshot.id, snapshot.complete, snapshot.created_increment, snapshot.name, snapshot.expires]
124
- rows << :separator
125
- part_count = 0
126
- snapshot.parts.each do |part|
127
- file_size_mb = part['fileSizeBytes'].to_i / (1024*1024)
128
- rows << [{:value => "part #{part_count}", :colspan => 4, :alignment => :right}, part['typeName'], part['replicaSetName'], "#{file_size_mb} MB"]
129
- part_count += 1
130
- end
131
- rows << :separator
132
- end
133
- when 'restorejobs', 'restorejobs-create'
134
- heading = ['RestoreId', 'SnapshotId / Cluster / Group', 'Name (created)', 'Status', 'Point in time', 'Delivery', 'Restore status']
135
- results_sorted = results.sort_by { |job| job.created }.reverse
136
- results_sorted.first(options[:limit]).each do |job|
137
- rows << [job.id, job.snapshot_id, job.name, job.status_name, job.point_in_time, job.delivery_method_name, job.delivery_status_name]
138
- rows << ['', "#{job.cluster.name} (#{job.cluster.id})", {:value => '', :colspan => 5}]
139
- rows << ['', job.cluster.group.name, {:value => '', :colspan => 5}]
140
- rows << [{:value => 'download url:', :colspan => 7}]
141
- rows << [{:value => job.delivery_url, :colspan => 7}]
142
- rows << :separator
143
- end
144
- end
145
-
146
- puts Terminal::Table.new :title => action.upcase, :headings => (heading.nil? ? [] : heading), :rows => rows
147
5
 
148
- rescue => e
149
- puts "Error: `#{e.message}`"
150
- exit 1
151
- end
6
+ MMS::CLI::CommandManager.run
data/lib/mms.rb CHANGED
@@ -1,15 +1,28 @@
1
1
  module MMS
2
2
  require 'rubygems' # For ruby < 1.9
3
3
 
4
+ require "uri"
5
+ require "json"
6
+ require "cgi"
7
+ require "net/http"
8
+ require 'net/http/digest_auth'
9
+ require 'terminal-table'
10
+ require 'pathname'
11
+
12
+ require 'mms/config'
4
13
  require 'mms/agent'
5
14
  require 'mms/client'
6
15
  require 'mms/cache'
7
16
  require 'mms/version'
8
17
  require 'mms/resource'
18
+ require 'mms/errors'
9
19
 
10
20
  require 'mms/resource/group'
11
21
  require 'mms/resource/host'
12
22
  require 'mms/resource/cluster'
13
23
  require 'mms/resource/snapshot'
14
24
  require 'mms/resource/restore_job'
25
+ require 'mms/resource/alert'
26
+
27
+ require 'mms/cli'
15
28
  end
@@ -2,37 +2,18 @@ module MMS
2
2
 
3
3
  class Agent
4
4
 
5
- def initialize(username, apikey)
6
- MMS::Client.instance.auth_setup(username, apikey)
5
+ attr_accessor :client
6
+
7
+ def initialize(client)
8
+ @client = client
7
9
  end
8
10
 
9
11
  def set_apiurl(apiurl)
10
- begin
11
- url_info = URI(apiurl)
12
- rescue URI::InvalidURIError
13
- puts "Unable to parse given apiurl: #{apiurl}"
14
- exit
15
- end
16
-
17
- # Split out version from URL path
18
- path_parts = url_info.path.split '/'
19
- api_version = path_parts.pop
20
- url_info.path = path_parts.join '/'
21
-
22
- # Update client singleton
23
- MMS::Client.instance.api_protocol = url_info.scheme
24
- MMS::Client.instance.api_host = url_info.host
25
- MMS::Client.instance.api_port = url_info.port
26
- MMS::Client.instance.api_path = url_info.path
27
- MMS::Client.instance.api_version = api_version
12
+ @client.url = apiurl
28
13
  end
29
14
 
30
15
  def groups
31
- group_list = []
32
- MMS::Client.instance.get('/groups').each do |group|
33
- group_list.push MMS::Resource::Group.new group['id'], group
34
- end
35
- group_list
16
+ MMS::Resource::Group.findGroups(@client)
36
17
  end
37
18
 
38
19
  def hosts
@@ -56,7 +37,15 @@ module MMS
56
37
  clusters.each do |cluster|
57
38
  snapshot_list.concat cluster.snapshots
58
39
  end
59
- snapshot_list
40
+ snapshot_list.sort_by { |snapshot| snapshot.created_date }.reverse
41
+ end
42
+
43
+ def alerts
44
+ alert_list = []
45
+ groups.each do |group|
46
+ alert_list.concat group.alerts
47
+ end
48
+ alert_list.sort_by { |alert| alert.created }.reverse
60
49
  end
61
50
 
62
51
  def restorejobs
@@ -64,15 +53,36 @@ module MMS
64
53
  clusters.each do |cluster|
65
54
  restorejob_list.concat cluster.restorejobs
66
55
  end
67
- restorejob_list
56
+ restorejob_list.sort_by { |job| job.created }.reverse
68
57
  end
69
58
 
70
- def restorejobs_create(group_id, cluster_id, snapshot_id)
71
- findGroup(group_id).cluster(cluster_id).snapshot(snapshot_id).create_restorejob
59
+ def restorejob_create(type_value, group_id, cluster_id)
60
+ if type_value.length == 24
61
+ findGroup(group_id).cluster(cluster_id).snapshot(type_value).create_restorejob
62
+ elsif datetime = (type_value == 'now' ? DateTime.now : DateTime.parse(type_value))
63
+ raise('Invalid datetime. Correct `YYYY-MM-RRTH:m:s`') if datetime.nil?
64
+ 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)
66
+ end
67
+ end
68
+
69
+ def alert_ack(alert_id, timestamp, group_id)
70
+ timestamp = DateTime.now if timestamp == 'now'
71
+ timestamp = DateTime.new(4000, 1, 1, 1, 1, 1, 1, 1) if timestamp == 'forever'
72
+
73
+ group = findGroup(group_id)
74
+
75
+ if alert_id == 'all'
76
+ group.alerts.each do |alert|
77
+ alert.ack(timestamp, 'Triggered by CLI for all alerts.')
78
+ end
79
+ elsif group.alert(alert_id).ack(timestamp, 'Triggered by CLI.')
80
+ end
72
81
  end
73
82
 
74
83
  def findGroup(id)
75
- MMS::Resource::Group.new id
84
+ MMS::Resource::Group.new(@client, {'id' => id})
76
85
  end
86
+
77
87
  end
78
88
  end
@@ -0,0 +1,258 @@
1
+ require 'clamp'
2
+ require 'parseconfig'
3
+
4
+ module MMS
5
+
6
+ class CLI
7
+
8
+ class MMS::CLI::Command < Clamp::Command
9
+
10
+ attr_accessor :app_name
11
+ attr_accessor :config
12
+
13
+ attr_accessor :client
14
+ attr_accessor :agent
15
+
16
+ option ['-u', '--username'], '<string>', 'MMS user' do |u|
17
+ @config.username = u
18
+ end
19
+
20
+ option ['-k', '--apikey'], '<string>', 'MMS api-key' do |a|
21
+ @config.apikey = a
22
+ end
23
+
24
+ option ['-a', '--apiurl'], '<string>', 'MMS api url. Full url including version: https://mms.mydomain.tld/api/public/v1.0' do |u|
25
+ @config.apiurl = u
26
+ end
27
+
28
+ option ['-v', '--version'], :flag, 'Version' do |v|
29
+ puts "mms-api v#{MMS::VERSION}"
30
+ exit
31
+ end
32
+
33
+ option ['-g', '--default-group-id'], '<string>', 'Default MMS group id' do |g|
34
+ @config.default_group_id = g
35
+ end
36
+
37
+ option ['-c', '--default-cluster-id'], '<string>', 'Default MMS cluster id' do |c|
38
+ @config.default_cluster_id = c
39
+ end
40
+
41
+ option ['--cfg'], '<string>', 'Config file path' do |p|
42
+ @config.config_path = p
43
+ parse_user_home_config
44
+ end
45
+
46
+ option ['-i', '--ignore'], :flag, 'Ignore flag of --group-id and -cluster-id', :default => false
47
+
48
+ option ['-j', '--json'], :flag, 'Print JSON output', :default => false
49
+
50
+ option ['-l', '--limit'], '<integer>', 'Limit for result items' do |l|
51
+ @config.limit = Integer(l)
52
+ end
53
+
54
+ def initialize(invocation_path, context = {}, parent_attribute_values = {})
55
+ @config ||= MMS::Config.new
56
+ end
57
+
58
+ def parse_user_home_config
59
+ raise(MMS::ConfigError.new('Config file path is not set!')) if @config.config_path.nil?
60
+ config_file = Pathname.new(@config.config_path)
61
+ raise(MMS::ConfigError.new("Config file `#{config_file}` does not exist")) unless config_file.exist?
62
+
63
+ config = ParseConfig.new(config_file)
64
+ config.params.map do |key, value|
65
+ begin
66
+ @config.send("#{key}=", value)
67
+ rescue Exception => e
68
+ raise MMS::ConfigError.new("Config option `#{key}` from file `#{config_file}` is not allowed!")
69
+ end
70
+ end
71
+
72
+ end
73
+
74
+ def agent
75
+ @client = MMS::Client.new(@config.username, @config.apikey)
76
+ @agent = MMS::Agent.new(client)
77
+ end
78
+
79
+ def print(heading, resource_list)
80
+ json? ? print_json(resource_list) : print_human(heading, resource_list)
81
+ end
82
+
83
+ def print_human(heading, resource_list)
84
+ rows = []
85
+
86
+ resource_list.first(@config.limit).each do |resource|
87
+ rows += resource.table_section
88
+ end
89
+
90
+ puts Terminal::Table.new :title => 'Hosts', :headings => (heading.nil? ? [] : heading), :rows => rows
91
+
92
+ print_tips unless ignore?
93
+ end
94
+
95
+ def print_json(resource_list)
96
+ rows = []
97
+
98
+ resource_list.first(@config.limit).each do |resource|
99
+ rows.push(resource.to_hash)
100
+ end
101
+
102
+ puts JSON.pretty_generate(rows)
103
+ end
104
+
105
+ def print_tips
106
+ puts 'Default group: ' + @config.default_group_id unless @config.default_group_id.nil?
107
+ puts 'Default cluster: ' + @config.default_cluster_id unless @config.default_cluster_id.nil?
108
+
109
+ if !@config.default_group_id.nil? or !@config.default_cluster_id.nil?
110
+ puts "Add flag --ignore or update --default-group-id, --default-cluster-id or update your `#{@config.config_path}` to see all resources"
111
+ end
112
+ end
113
+
114
+ def run(arguments)
115
+ begin
116
+ parse_user_home_config
117
+ super
118
+ rescue Clamp::HelpWanted => e
119
+ raise(help)
120
+ rescue Clamp::UsageError => e
121
+ raise([e.message, help].join("\n"))
122
+ rescue MMS::AuthError => e
123
+ raise('Authorisation problem. Please check you credential!')
124
+ rescue MMS::ResourceError => e
125
+ raise(["Resource #{e.resource.class.name} problem:", e.message].join("\n"))
126
+ end
127
+ end
128
+ end
129
+
130
+ class MMS::CLI::Command::Hosts < MMS::CLI::Command
131
+
132
+ subcommand 'list', 'Host list' do
133
+
134
+ def execute
135
+ print(MMS::Resource::Host.table_header, agent.hosts)
136
+ end
137
+ end
138
+
139
+ end
140
+
141
+ class MMS::CLI::Command::Groups < MMS::CLI::Command
142
+
143
+ subcommand 'list', 'Group list' do
144
+
145
+ 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)
151
+ end
152
+ end
153
+
154
+ end
155
+
156
+ class MMS::CLI::Command::Clusters < MMS::CLI::Command
157
+
158
+ subcommand 'list', 'Cluster list' do
159
+
160
+ 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?
163
+
164
+ print(MMS::Resource::Cluster.table_header, cluster_list)
165
+ end
166
+ end
167
+
168
+ end
169
+
170
+
171
+ class MMS::CLI::Command::Alerts < MMS::CLI::Command
172
+
173
+ subcommand 'list', 'Alerts list' do
174
+
175
+ def execute
176
+ print(MMS::Resource::Alert.table_header, agent.alerts)
177
+ end
178
+
179
+ end
180
+
181
+ subcommand 'ack', 'Acknowledge alert' do
182
+
183
+ parameter '[alert-id]', 'Alert ID', :default => 'all'
184
+ parameter '[group-id]', 'Group ID', :default => '--default-group-id'
185
+ parameter '[timestamp]', 'Postpone to timestamp', :default => 'forever'
186
+
187
+ def execute
188
+ g_id = group_id == '--default-group-id' ? @config.default_group_id : group_id
189
+ agent.alert_ack(alert_id, timestamp, g_id)
190
+ puts 'Done.'
191
+ end
192
+
193
+ end
194
+
195
+ end
196
+
197
+ class MMS::CLI::Command::Snapshots < MMS::CLI::Command
198
+
199
+ subcommand 'list', 'Snapshot list' do
200
+
201
+ def execute
202
+ print(MMS::Resource::Snapshot.table_header, agent.snapshots)
203
+ end
204
+ end
205
+
206
+ end
207
+
208
+ class MMS::CLI::Command::RestoreJobs < MMS::CLI::Command
209
+
210
+ subcommand 'list', 'Restorejob list' do
211
+
212
+ def execute
213
+ print(MMS::Resource::RestoreJob.table_header, agent.restorejobs)
214
+ end
215
+
216
+ end
217
+
218
+ subcommand 'create', 'Restorejob create' do
219
+
220
+ parameter '[snapshot-source]', 'Restore from source. Options: now | timestamp | snapshot-id', :default => 'now'
221
+ parameter '[group-id]', 'Group ID', :default => '--default-group-id'
222
+ parameter '[cluster-id]', 'Cluster ID', :default => '--default-cluster-id'
223
+
224
+ def execute
225
+ g_id = group_id == '--default-group-id' ? @config.default_group_id : group_id
226
+ c_id = cluster_id == '--default-cluster-id' ? @config.default_cluster_id : cluster_id
227
+
228
+ agent.restorejob_create(snapshot_source, g_id, c_id)
229
+
230
+ puts 'Done.'
231
+ end
232
+
233
+ end
234
+
235
+ end
236
+
237
+ class MMS::CLI::CommandManager < MMS::CLI::Command
238
+
239
+ def run(arguments)
240
+ begin
241
+ super
242
+ rescue Exception => e
243
+ abort(e.message.empty? ? 'Unknown error/Interrupt' : e.message)
244
+ end
245
+ end
246
+
247
+ subcommand 'groups', 'Groups ', MMS::CLI::Command::Groups
248
+ subcommand 'hosts', 'Hosts', MMS::CLI::Command::Hosts
249
+ subcommand 'clusters', 'Clusters', MMS::CLI::Command::Clusters
250
+ subcommand 'alerts', 'Alerts', MMS::CLI::Command::Alerts
251
+ subcommand 'snapshots', 'Snapshots', MMS::CLI::Command::Snapshots
252
+ subcommand 'restorejobs', 'Restorejobs', MMS::CLI::Command::RestoreJobs
253
+
254
+ end
255
+
256
+ end
257
+
258
+ end