mms-api 0.0.9 → 0.0.10

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 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