enfcli 4.0.0 → 5.0.0.pre.alpha

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
  SHA256:
3
- metadata.gz: 255cec434b6f65e51e5736e54d47d0752a5328f88e72a2567c3b3dbd99f93873
4
- data.tar.gz: 2f7d9068c55410ed289af80d1953302363cb65f4c25a2ab430bbef32126270be
3
+ metadata.gz: 29f4309503935f6931b068e80a850488b2f8833474734c05e8455a04f84293e0
4
+ data.tar.gz: 2488271b45ee7c7e5b96cc95546d2f625fb1c503d9ad6720f62649073d4a1874
5
5
  SHA512:
6
- metadata.gz: 1a7e8d53f0c2f190844768ef6c74905ec6437f2ae2038150adf4f010d8e9f3890f23b518e42c00565a8f2656fb40990a7ace5be6309da4d151e127d1c3c8bfc8
7
- data.tar.gz: 8f37ea162b259939302a2a36fae2ff51d93bc930ce8baae72d61ea0cfcb2cc997b8b9a076ad87c2c8c4a51a27329e54f91b2b55f574789215731a2c6eb563ca3
6
+ metadata.gz: 033366cb4db237f61526ddf357bbdfd57d60b482398d21eee798413b5afc91b51a6baae60526b957f07a80f01dea5b47372d72193d40b0af20a98fb88de1cd51
7
+ data.tar.gz: e7bd3d1c7da7a861a89f242bd5a2d2f898e5e5b4f848c2412fa9a1b5acb7ac73fb5c679979e80b9b7d1e81ba87de761f157141d49eda2d6c3c5d55b1b315c249
@@ -1,4 +1,4 @@
1
- FROM circleci/ruby
1
+ FROM circleci/ruby:2.6.3-stretch
2
2
  MAINTAINER Xaptum
3
3
 
4
4
 
@@ -8,4 +8,4 @@ LABEL description="Base image for encli build"
8
8
  RUN gem install bundler
9
9
  RUN gem install bump
10
10
  RUN gem install geminabox
11
-
11
+ RUN gem install rufo
@@ -49,6 +49,11 @@ jobs:
49
49
  - ./vendor/bundle
50
50
  key: v1-dependencies-{{ checksum "Gemfile.lock" }}
51
51
 
52
+ - run:
53
+ name: Check code format
54
+ command: |
55
+ make check-format
56
+
52
57
  # run tests!
53
58
  - run:
54
59
  name: run tests
@@ -1,7 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- enfcli (4.0.0)
4
+ enfcli (5.0.0.pre.alpha)
5
+ clipboard
6
+ ffi
7
+ readline
5
8
  rest-client (~> 2.0)
6
9
  terminal-table
7
10
  thor (~> 0.20.0)
@@ -9,61 +12,69 @@ PATH
9
12
  GEM
10
13
  remote: https://rubygems.org/
11
14
  specs:
12
- addressable (2.5.2)
13
- public_suffix (>= 2.0.2, < 4.0)
14
- bump (0.6.1)
15
+ addressable (2.7.0)
16
+ public_suffix (>= 2.0.2, < 5.0)
17
+ bump (0.8.0)
18
+ clipboard (1.3.3)
15
19
  crack (0.4.3)
16
20
  safe_yaml (~> 1.0.0)
17
21
  diff-lcs (1.3)
18
22
  domain_name (0.5.20190701)
19
23
  unf (>= 0.0.5, < 1.0.0)
20
- fuubar (2.3.2)
24
+ ffi (1.12.2)
25
+ fuubar (2.5.0)
21
26
  rspec-core (~> 3.0)
22
27
  ruby-progressbar (~> 1.4)
23
- hashdiff (0.3.7)
28
+ hashdiff (1.0.0)
24
29
  http-accept (1.7.0)
25
30
  http-cookie (1.0.3)
26
31
  domain_name (~> 0.5)
27
- mime-types (3.3)
32
+ io-console (0.5.5)
33
+ mime-types (3.3.1)
28
34
  mime-types-data (~> 3.2015)
29
35
  mime-types-data (3.2019.1009)
30
36
  netrc (0.11.0)
31
- public_suffix (3.0.3)
37
+ public_suffix (4.0.3)
32
38
  rake (10.5.0)
39
+ readline (0.0.2)
40
+ reline
41
+ reline (0.1.2)
42
+ io-console (~> 0.5)
33
43
  rest-client (2.1.0)
34
44
  http-accept (>= 1.7.0, < 2.0)
35
45
  http-cookie (>= 1.0.2, < 2.0)
36
46
  mime-types (>= 1.16, < 4.0)
37
47
  netrc (~> 0.8)
38
- rspec (3.8.0)
39
- rspec-core (~> 3.8.0)
40
- rspec-expectations (~> 3.8.0)
41
- rspec-mocks (~> 3.8.0)
42
- rspec-core (3.8.0)
43
- rspec-support (~> 3.8.0)
44
- rspec-expectations (3.8.1)
48
+ rspec (3.9.0)
49
+ rspec-core (~> 3.9.0)
50
+ rspec-expectations (~> 3.9.0)
51
+ rspec-mocks (~> 3.9.0)
52
+ rspec-core (3.9.1)
53
+ rspec-support (~> 3.9.1)
54
+ rspec-expectations (3.9.0)
45
55
  diff-lcs (>= 1.2.0, < 2.0)
46
- rspec-support (~> 3.8.0)
47
- rspec-mocks (3.8.0)
56
+ rspec-support (~> 3.9.0)
57
+ rspec-mocks (3.9.1)
48
58
  diff-lcs (>= 1.2.0, < 2.0)
49
- rspec-support (~> 3.8.0)
50
- rspec-support (3.8.0)
59
+ rspec-support (~> 3.9.0)
60
+ rspec-support (3.9.2)
51
61
  rspec_junit_formatter (0.4.1)
52
62
  rspec-core (>= 2, < 4, != 2.12.0)
53
- ruby-progressbar (1.10.0)
54
- safe_yaml (1.0.4)
63
+ ruby-progressbar (1.10.1)
64
+ rufo (0.8.1)
65
+ safe_yaml (1.0.5)
55
66
  terminal-table (1.8.0)
56
67
  unicode-display_width (~> 1.1, >= 1.1.1)
57
68
  thor (0.20.3)
58
69
  unf (0.1.4)
59
70
  unf_ext
60
71
  unf_ext (0.0.7.6)
61
- unicode-display_width (1.6.0)
62
- vcr (4.0.0)
63
- webmock (3.4.2)
72
+ unicode-display_width (1.6.1)
73
+ vcr (5.0.0)
74
+ webmock (3.7.6)
64
75
  addressable (>= 2.3.6)
65
76
  crack (>= 0.3.2)
66
- hashdiff
77
+ hashdiff (>= 0.4.0, < 2.0.0)
67
78
 
68
79
  PLATFORMS
69
80
  ruby
@@ -76,8 +87,9 @@ DEPENDENCIES
76
87
  rake (~> 10.0)
77
88
  rspec
78
89
  rspec_junit_formatter
90
+ rufo
79
91
  vcr
80
92
  webmock
81
93
 
82
94
  BUNDLED WITH
83
- 2.0.2
95
+ 2.1.4
data/Makefile CHANGED
@@ -24,5 +24,12 @@ version:
24
24
  test:
25
25
  bundle exec rspec --format Fuubar --color spec/**/*_spec.rb
26
26
 
27
+ format:
28
+ ./format.sh
29
+
30
+ check-format:
31
+ @rufo --check lib
32
+ @rufo --check spec
33
+
27
34
  clean:
28
35
  rm -rf pkg
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # enfcli
2
2
 
3
-
3
+ The `enfcli` - Xaptum's CLI tool - allows you to easily manage your ENF resources. Check out [the docs](https://docs.xaptum.com/api) for examples of the various `enfcli` commands available for you to use.
4
4
 
5
5
  ## Installation
6
6
 
@@ -24,16 +24,62 @@ $ gem install enfcli --pre
24
24
 
25
25
  ## Usage
26
26
 
27
- - Connect to ENF
27
+ There are two ways to connect to the ENF through the `enfcli`.
28
+
29
+ 1. Configuration file
30
+
31
+ The recommended way to connect to the ENF through the `enfcli` is by creating a configuration file (`.xaptum_config.json`) in your home directory. The `enfcli` will read your configuration from this file whenever you attempt to connect, and will save you from entering in your `host` and `username` parameters each time. The following command creates a config file in your home directory.
32
+
33
+ ```
34
+ $ enfcli create-config-file --host=<HOST> --user=<USERNAME>
35
+ Config file created successfully at /Users/dylanirlbeck/.xaptum_config.json!
36
+ ```
37
+
38
+ You can view your current configuration at any time by doing the following:
39
+
40
+ ```
41
+ $ enfcli display-config-file
42
+ {"host":<HOST>,"user":<USERNAME>}
43
+ ```
44
+
45
+ With your configuration file created, connect to the ENF by simply doing
46
+ ```
47
+ $ enfcli
48
+ Connecting to <HOST>.....
49
+ Enter Password: <PASSWORD>
50
+ ```
51
+
52
+ 2. CLI parameters
53
+
54
+ Instead of a configuration file, you can always connect to the ENF through the `enfcli` by providing your host and username as command line parameters
55
+
56
+ ```bash
57
+ $ enfcli --host <host> --user <user>
58
+ ```
59
+
60
+ Whichever way you choose, you'll be prompted for your account password as the final step of authentication. Once authenticated, type `help` in `enfcli` prompt to list all available `enfcli` commands
61
+
62
+ ```bash
63
+ enfcli-user@acme> help
64
+ ```
65
+
66
+ ## Development
67
+ - Clone the repository
68
+ - Create a new branch
28
69
  ```bash
29
- $ enfcli --host <host> --user <user>
70
+ git checkout -b <GIT_USER_NAME>/<BRANCH_NAME>
30
71
  ```
31
- Once authenticated, type `help` in `enfcli` prompt to list all available `enfcli` commands
32
-
72
+ - Bump the version
33
73
  ```bash
34
- enfcli-user@domain> help
74
+ make bump-pre
75
+ ```
76
+ - Ensure code is formatted using `rufo`. The build process will fail if the code is not formatted.
77
+ ```bash
78
+ make format
35
79
  ```
36
80
 
81
+ **NOTE: Do not fork the repository**
82
+
37
83
  ## Release
38
84
  `enfcli` pre-release and release versions are automatically published to [RubyGems](https://rubygems.org) by the build process. Each commit to `master` branch publishes a pre-release version of the gem.
39
85
 
@@ -64,4 +110,3 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
64
110
  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
65
111
  License for the specific language governing permissions and limitations under
66
112
  the License.
67
-
@@ -1,16 +1,15 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
2
+ lib = File.expand_path("../lib", __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'enfcli/version'
4
+ require "enfcli/version"
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "enfcli"
8
- spec.version = EnfCli::VERSION
9
- spec.authors = ["Venkatakumar Srinivasan"]
10
- spec.email = ["venkat@xaptum.com"]
11
-
12
- spec.summary = %q{Xaptum ENF CLI.}
13
- spec.homepage = "https://www.xaptum.com"
7
+ spec.name = "enfcli"
8
+ spec.version = EnfCli::VERSION
9
+ spec.authors = ["Venkatakumar Srinivasan"]
10
+ spec.email = ["venkat@xaptum.com"]
11
+ spec.summary = "Xaptum ENF CLI."
12
+ spec.homepage = "https://www.xaptum.com"
14
13
 
15
14
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
16
15
  # to allow pushing to a single host or delete this section to allow pushing to any host.
@@ -20,27 +19,30 @@ Gem::Specification.new do |spec|
20
19
  # raise "RubyGems 2.0 or newer is required to protect against " \
21
20
  # "public gem pushes."
22
21
  #end
23
-
24
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
22
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
25
23
  f.match(%r{^(test|spec|features)/})
26
24
  end
27
- spec.bindir = "bin"
28
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
25
+
26
+ spec.bindir = "bin"
27
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
29
28
  spec.require_paths = ["lib"]
30
29
 
31
- spec.add_dependency 'thor', '~> 0.20.0'
32
- spec.add_dependency "rest-client", "~> 2.0"
33
- spec.add_dependency "terminal-table"
30
+ spec.add_dependency("thor", "~> 0.20.0")
31
+ spec.add_dependency("rest-client", "~> 2.0")
32
+ spec.add_dependency("terminal-table")
33
+ spec.add_dependency("clipboard")
34
+ spec.add_dependency("ffi")
35
+ spec.add_dependency("readline")
36
+
34
37
  #spec.add_dependency "websocket-client-simple"
35
38
  #spec.add_dependency "colorize"
36
-
37
- spec.add_development_dependency "bundler"
38
- spec.add_development_dependency "rake", "~> 10.0"
39
- spec.add_development_dependency "bump"
40
- spec.add_development_dependency "rspec"
41
- spec.add_development_dependency "rspec_junit_formatter"
42
- spec.add_development_dependency "fuubar"
43
- spec.add_development_dependency "vcr"
44
- spec.add_development_dependency "webmock"
45
-
39
+ spec.add_development_dependency("bundler")
40
+ spec.add_development_dependency("rake", "~> 10.0")
41
+ spec.add_development_dependency("bump")
42
+ spec.add_development_dependency("rspec")
43
+ spec.add_development_dependency("rspec_junit_formatter")
44
+ spec.add_development_dependency("fuubar")
45
+ spec.add_development_dependency("vcr")
46
+ spec.add_development_dependency("webmock")
47
+ spec.add_development_dependency("rufo")
46
48
  end
@@ -0,0 +1,9 @@
1
+ #!/bin/bash
2
+
3
+ ## Formatting is done using rufo library
4
+ ## rufo exits with exit code 3 if it is able to
5
+ ## format the code.
6
+
7
+ echo "Formatting code.."
8
+ rufo lib spec
9
+ echo "Formatted!"
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright 2018 Xaptum,Inc
2
+ # Copyright 2020 Xaptum,Inc
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
@@ -13,11 +13,11 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- require 'rest-client'
17
- require 'singleton'
18
- require 'json'
19
- require 'date'
20
- require 'cgi'
16
+ require "rest-client"
17
+ require "singleton"
18
+ require "json"
19
+ require "date"
20
+ require "cgi"
21
21
 
22
22
  #
23
23
  # NOTE: When api's are refactored into individual classes
@@ -26,13 +26,20 @@ require 'cgi'
26
26
  #
27
27
 
28
28
  module EnfApi
29
-
30
29
  def self.to_json(hash)
31
30
  JSON.generate(hash)
32
31
  end
33
32
 
33
+ def self.from_json(string)
34
+ begin
35
+ JSON.parse(string, { symbolize_names: true })
36
+ rescue
37
+ raise EnfApi::ERROR, "Unable to parse api response json!"
38
+ end
39
+ end
40
+
34
41
  def self.url_encode(str)
35
- CGI.escape( str ).gsub("+", "%20")
42
+ CGI.escape(str).gsub("+", "%20")
36
43
  end
37
44
 
38
45
  class ERROR < StandardError
@@ -41,104 +48,6 @@ module EnfApi
41
48
  end
42
49
  end
43
50
 
44
- class Dns
45
- include Singleton
46
-
47
- def initialize
48
- @version = "2019-05-27"
49
- @xdns_base_url = "/api/xdns/#{@version}"
50
- end
51
-
52
- def list_zones(domain)
53
- EnfApi::API.instance.get "#{@xdns_base_url}/zones?enf_domain=#{domain}"
54
- end
55
-
56
- def create_dns_zone(new_zone)
57
- json = EnfApi::to_json(new_zone)
58
- EnfApi::API.instance.post "#{@xdns_base_url}/zones", json
59
- end
60
-
61
- def update_dns_zone(zone_id, updated_zone)
62
- json = EnfApi::to_json(updated_zone)
63
- EnfApi::API.instance.put "#{@xdns_base_url}/zones/#{zone_id}", json
64
- end
65
-
66
- def delete_dns_zone(zone_id)
67
- EnfApi::API.instance.delete "#{@xdns_base_url}/zones/#{zone_id}"
68
- end
69
-
70
- def add_networks_to_zone(zone_id, add_networks)
71
- json = EnfApi::to_json(add_networks)
72
- EnfApi::API.instance.post "#{@xdns_base_url}/zones/#{zone_id}/networks", json
73
- end
74
-
75
- def replace_networks_in_zone(zone_id, replace_networks)
76
- json = EnfApi::to_json(replace_networks)
77
- EnfApi::API.instance.put "#{@xdns_base_url}/zones/#{zone_id}/networks", json
78
- end
79
-
80
- def list_networks_in_zone(zone_id)
81
- EnfApi::API.instance.get "#{@xdns_base_url}/zones/#{zone_id}/networks"
82
- end
83
-
84
- def delete_networks_from_zone(zone_id, delete_networks)
85
- EnfApi::API.instance.delete "#{@xdns_base_url}/zones/#{zone_id}/networks?delete=#{delete_networks}"
86
- end
87
-
88
- def list_zones_in_network(network)
89
- EnfApi::API.instance.get "#{@xdns_base_url}/networks/#{network}/zones"
90
- end
91
-
92
- def provision_server(network, new_server)
93
- json = EnfApi::to_json(new_server)
94
- EnfApi::API.instance.post "#{@xdns_base_url}/networks/#{network}/servers", json
95
- end
96
-
97
- def list_servers(network)
98
- EnfApi::API.instance.get "#{@xdns_base_url}/networks/#{network}/servers"
99
- end
100
-
101
- def delete_server(network, server_ipv6)
102
- EnfApi::API.instance.delete "#{@xdns_base_url}/networks/#{network}/servers/#{server_ipv6}"
103
- end
104
-
105
- def create_dns_record(zone_id, new_record)
106
- json = EnfApi::to_json(new_record)
107
- EnfApi::API.instance.post "#{@xdns_base_url}/zones/#{zone_id}/records", json
108
- end
109
-
110
- def list_dns_records(zone_id)
111
- EnfApi::API.instance.get "#{@xdns_base_url}/zones/#{zone_id}/records"
112
- end
113
-
114
- def query(network, type, name)
115
- EnfApi::API.instance.get "#{@xdns_base_url}/networks/#{network}/query/#{type}/#{name}"
116
- end
117
-
118
- def delete_dns_record(record_id)
119
- EnfApi::API.instance.delete "#{@xdns_base_url}/records/#{record_id}"
120
- end
121
-
122
- end
123
-
124
- class Firewall
125
- include Singleton
126
-
127
- def list_firewall_rules(network)
128
- EnfApi::API.instance.get "/api/xfw/v1/#{network}/rule"
129
- end
130
-
131
- def add_firewall_rule(network, rule)
132
- rule_json = EnfApi::to_json(rule)
133
- EnfApi::API.instance.post "/api/xfw/v1/#{network}/rule", rule_json
134
- end
135
-
136
- def delete_firewall_rules(network, id = nil)
137
- # Same method to call to delete all firewall rules in a network. if id is nil
138
- EnfApi::API.instance.delete "/api/xfw/v1/#{network}/rule/#{id}"
139
- end
140
- end
141
-
142
51
  class Iam
143
52
  include Singleton
144
53
 
@@ -188,7 +97,6 @@ module EnfApi
188
97
  json = EnfApi::to_json(credentials)
189
98
  EnfApi::API.instance.post "/api/xiam/v1/endpoints/#{ipv6}/credentials", json
190
99
  end
191
-
192
100
  end
193
101
 
194
102
  ##############################################################################
@@ -229,13 +137,13 @@ module EnfApi
229
137
  ## NO_TEST
230
138
  def create_device(new_dev_hash)
231
139
  json = EnfApi.to_json(new_dev_hash)
232
- EnfApi::API.instance.post '/api/captive/v1/device', json
140
+ EnfApi::API.instance.post "/api/captive/v1/device", json
233
141
  end
234
142
 
235
143
  # Get the list of devices
236
144
  ## NO_TEST
237
145
  def list_devices(network)
238
- url = '/api/captive/v1/device'
146
+ url = "/api/captive/v1/device"
239
147
  url = "#{url}?#{network}" if network
240
148
  EnfApi::API.instance.get url
241
149
  end
@@ -253,7 +161,6 @@ module EnfApi
253
161
  EnfApi::API.instance.put "/api/captive/v1/device/#{id}", json
254
162
  end
255
163
 
256
-
257
164
  # Get the status of a device
258
165
  ## NO_TEST
259
166
  def get_device_status(dev_id)
@@ -267,7 +174,6 @@ module EnfApi
267
174
  EnfApi::API.instance.post "/api/captive/v1/profile", json
268
175
  end
269
176
 
270
-
271
177
  # Get the list of profiles
272
178
  # name is a substring of the profile names to be returned
273
179
  ## NO_TEST
@@ -279,16 +185,99 @@ module EnfApi
279
185
 
280
186
  # Get detail on a specific profile
281
187
  ## NO_TEST
282
- def get_profile (profile_id)
188
+ def get_profile(profile_id)
283
189
  EnfApi::API.instance.get "/api/captive/v1/profile/#{profile_id}"
284
190
  end
285
191
 
286
192
  # Send update PUT request for profile
287
193
  ## NO_TEST
288
- def update_profile (id, profile_updates)
194
+ def update_profile(id, profile_updates)
289
195
  json = EnfApi.to_json(profile_updates)
290
196
  EnfApi::API.instance.put "/api/captive/v1/profile/#{id}", json
291
197
  end
198
+
199
+ # Get the list of devices
200
+ ## NO_TEST
201
+ def list_firmware_images()
202
+ url = "/api/captive/v1/firmware/release"
203
+ EnfApi::API.instance.get url
204
+ end
205
+
206
+ # Upload the firmware image
207
+ # Current version sends an empty body - captive server doesn't support
208
+ # sending the binary image yet.
209
+ ## NO_TEST
210
+ def upload_firmware_image(version, image_name)
211
+ url = "/api/captive/v1/firmware/release/#{version}/#{image_name}"
212
+ EnfApi::API.instance.put url
213
+ end
214
+
215
+ # gets the details for a specific firmware version
216
+ ## NO_TEST
217
+ def get_firmware_info(version)
218
+ url = "/api/captive/v1/firmware/release/#{version}"
219
+ EnfApi::API.instance.get url
220
+ end
221
+
222
+ # creates a new schedule object via POST
223
+ ## NO_TEST
224
+ def create_schedule(sched_hash)
225
+ json = EnfApi.to_json(sched_hash)
226
+ EnfApi::API.instance.post "/api/captive/v1/schedule", json
227
+ end
228
+
229
+ # GETs a list of all existing schedules
230
+ ## NO_TEST
231
+ def list_schedules
232
+ EnfApi::API.instance.get "/api/captive/v1/schedule"
233
+ end
234
+
235
+ # GETs the details of a specific schedule
236
+ ## NO_TEST
237
+ def get_schedule(id)
238
+ EnfApi::API.instance.get "/api/captive/v1/schedule/#{id}"
239
+ end
240
+
241
+ # update the details of a specific schedule
242
+ ## NO_TEST
243
+ def update_schedule(id, sched_hash)
244
+ json = EnfApi.to_json(sched_hash)
245
+ url = "/api/captive/v1/schedule/#{id}"
246
+ EnfApi::API.instance.put url, json
247
+ end
248
+
249
+ # DELETEs the specified schedule
250
+ ## NO_TEST
251
+ def delete_schedule(id)
252
+ EnfApi::API.instance.delete "/api/captive/v1/schedule/#{id}"
253
+ end
254
+
255
+ # GET the list of existing update objects
256
+ ## NO_TEST
257
+ def list_firmware_updates()
258
+ EnfApi::API.instance.get "/api/captive/v1/firmware/update"
259
+ end
260
+
261
+ # GET details of a specified firmware update task
262
+ ## NO_TEST
263
+ def get_firmware_update(update_id)
264
+ EnfApi::API.instance.get "/api/captive/v1/firmware/update/#{update_id}"
265
+ end
266
+
267
+ # POSTs a new firmware-udpate object
268
+ ## NO_TEST
269
+ def create_firmware_update(update_hash)
270
+ json = EnfApi.to_json(update_hash)
271
+ EnfApi::API.instance.post "/api/captive/v1/firmware/update", json
272
+ end
273
+
274
+ # uses PUT to modify an existing firmware update task
275
+ ## NO_TEST
276
+ def modify_firmware_update(update_id, update_hash)
277
+ url = "/api/captive/v1/firmware/update/#{update_id}"
278
+ json = EnfApi.to_json(update_hash)
279
+ EnfApi::API.instance.put url, json
280
+ end
292
281
  end
293
282
 
294
283
  class NetworkManager
@@ -311,11 +300,11 @@ module EnfApi
311
300
  @api = RestClient::Resource.new(host)
312
301
 
313
302
  # Create request json
314
- hash = { :username => user, :token => password }
315
- json = to_json( hash )
303
+ hash = { username: user, password: password }
304
+ json = to_json(hash)
316
305
 
317
306
  # call api
318
- @api["/api/xcr/v2/xauth"].post( json, {content_type: :json, accept: :json}) { |response, request, result|
307
+ @api["/api/xcr/v3/xauth"].post(json, { content_type: :json, accept: :json }) { |response, request, result|
319
308
  case response.code
320
309
  when 200
321
310
  # get resp from json
@@ -323,7 +312,7 @@ module EnfApi
323
312
 
324
313
  # set request headers for subsequent api calls
325
314
  token = resp[:data][0][:token]
326
- @headers = {content_type: :json, accept: :json, "Authorization" => "Bearer #{token}"}
315
+ @headers = { content_type: :json, accept: :json, "Authorization" => "Bearer #{token}" }
327
316
 
328
317
  # return resp
329
318
  resp
@@ -334,267 +323,225 @@ module EnfApi
334
323
  end
335
324
 
336
325
  def get(request_uri)
337
- @api[request_uri].get(@headers) {|response, request, result|
326
+ @api[request_uri].get(@headers) { |response, request, result|
338
327
  process_api_response response, request, result
339
328
  }
340
329
  end
341
330
 
342
- def post(request_uri, request_body = '')
343
- @api[request_uri].post(request_body, @headers) {|response, request, result|
331
+ def post(request_uri, request_body = "")
332
+ @api[request_uri].post(request_body, @headers) { |response, request, result|
344
333
  process_api_response response, request, result
345
334
  }
346
335
  end
347
336
 
348
- def put(request_uri, request_body = '')
349
- @api[request_uri].put(request_body, @headers) {|response, request, result|
337
+ def put(request_uri, request_body = "")
338
+ @api[request_uri].put(request_body, @headers) { |response, request, result|
350
339
  process_api_response response, request, result
351
340
  }
352
341
  end
353
342
 
354
343
  def delete(request_uri)
355
- @api[request_uri].delete(@headers) {|response, request, result|
344
+ @api[request_uri].delete(@headers) { |response, request, result|
356
345
  process_api_response response, request, result
357
346
  }
358
347
  end
359
348
 
360
- ############################################################################################################################
361
- # NOT READY API. MOVE ABOVE THIS LINE AFTER RSPEC OR INTO OWN CLASS
362
- ############################################################################################################################
349
+ ############################################################################################################################
350
+ # NOT READY API. MOVE ABOVE THIS LINE AFTER RSPEC OR INTO OWN CLASS
351
+ ############################################################################################################################
363
352
  def list_domain_nws(domain_id)
364
- @api["/api/xcr/v2/domains/#{domain_id}/nws"].get(@headers) {|response, request, result|
353
+ @api["/api/xcr/v3/domains/#{domain_id}/nws"].get(@headers) { |response, request, result|
365
354
  process_api_response response, request, result
366
355
  }
367
356
  end
368
357
 
369
358
  def list_enfnws
370
- @api["/api/xcr/v2/enfnws"].get( @headers) {|response, request, result|
359
+ @api["/api/xcr/v3/enfnws"].get(@headers) { |response, request, result|
371
360
  process_api_response response, request, result
372
361
  }
373
362
  end
374
363
 
375
364
  def list_domains
376
- @api["/api/xcr/v2/domains"].get( @headers) {|response, request, result|
365
+ @api["/api/xcr/v3/domains"].get(@headers) { |response, request, result|
377
366
  process_api_response response, request, result
378
367
  }
379
368
  end
380
369
 
381
370
  def get_domain(domain_id)
382
- @api["/api/xcr/v2/domains/#{domain_id}"].get( @headers) {|response, request, result|
371
+ @api["/api/xcr/v3/domains/#{domain_id}"].get(@headers) { |response, request, result|
383
372
  process_api_response response, request, result
384
373
  }
385
374
  end
386
375
 
387
376
  def create_domain(domain_hash)
388
- json = to_json( domain_hash )
389
- @api["/api/xcr/v2/domains"].post( json, @headers) {|response, request, result|
377
+ json = to_json(domain_hash)
378
+ @api["/api/xcr/v3/domains"].post(json, @headers) { |response, request, result|
390
379
  process_api_response response, request, result
391
380
  }
392
381
  end
393
382
 
394
383
  def update_domain_rate_limits(domain_network, limit, limits_hash)
395
- json = to_json( limits_hash )
396
- @api["/api/xcr/v2/domains/#{domain_network}/ep_rate_limits/#{limit}"].put( json, @headers) {|response, request, result|
384
+ json = to_json(limits_hash)
385
+ @api["/api/xcr/v3/domains/#{domain_network}/ep_rate_limits/#{limit}"].put(json, @headers) { |response, request, result|
397
386
  process_api_response response, request, result
398
387
  }
399
388
  end
400
389
 
401
390
  def update_network_rate_limits(network, limit, limits_hash)
402
- json = to_json( limits_hash )
403
- @api["/api/xcr/v2/nws/#{network}/ep_rate_limits/#{limit}"].put( json, @headers) {|response, request, result|
391
+ json = to_json(limits_hash)
392
+ @api["/api/xcr/v3/nws/#{network}/ep_rate_limits/#{limit}"].put(json, @headers) { |response, request, result|
404
393
  process_api_response response, request, result
405
394
  }
406
395
  end
407
396
 
408
397
  def update_ep_rate_limits(ipv6, limit, limits_hash)
409
- json = to_json( limits_hash )
410
- @api["/api/xcr/v2/cxns/#{ipv6}/ep_rate_limits/#{limit}"].put( json, @headers) {|response, request, result|
398
+ json = to_json(limits_hash)
399
+ @api["/api/xcr/v3/cxns/#{ipv6}/ep_rate_limits/#{limit}"].put(json, @headers) { |response, request, result|
411
400
  process_api_response response, request, result
412
401
  }
413
402
  end
414
403
 
415
404
  def get_domain_rate_limits(domain_network, filter = nil)
416
- api_url = "/api/xcr/v2/domains/#{domain_network}/ep_rate_limits"
405
+ api_url = "/api/xcr/v3/domains/#{domain_network}/ep_rate_limits"
417
406
  api_url = "#{api_url}/#{filter}" if filter
418
407
 
419
- @api[api_url].get( @headers) {|response, request, result|
408
+ @api[api_url].get(@headers) { |response, request, result|
420
409
  process_api_response response, request, result
421
410
  }
422
411
  end
423
412
 
424
413
  def get_network_rate_limits(network, filter = nil)
425
- api_url = "/api/xcr/v2/nws/#{network}/ep_rate_limits"
414
+ api_url = "/api/xcr/v3/nws/#{network}/ep_rate_limits"
426
415
  api_url = "#{api_url}/#{filter}" if filter
427
416
 
428
- @api[api_url].get( @headers) {|response, request, result|
417
+ @api[api_url].get(@headers) { |response, request, result|
429
418
  process_api_response response, request, result
430
419
  }
431
420
  end
432
421
 
433
422
  def get_ep_rate_limits(ipv6, filter = nil)
434
- api_url = "/api/xcr/v2/cxns/#{ipv6}/ep_rate_limits"
423
+ api_url = "/api/xcr/v3/cxns/#{ipv6}/ep_rate_limits"
435
424
  api_url = "#{api_url}/#{filter}" if filter
436
425
 
437
- @api[api_url].get( @headers) {|response, request, result|
426
+ @api[api_url].get(@headers) { |response, request, result|
438
427
  process_api_response response, request, result
439
428
  }
440
429
  end
441
430
 
442
431
  def update_domain_status(domain_network, status)
443
432
  json = to_json(status)
444
- @api["/api/xcr/v2/domains/#{domain_network}/status"].put(json, @headers) {|response, request, result|
433
+ @api["/api/xcr/v3/domains/#{domain_network}/status"].put(json, @headers) { |response, request, result|
445
434
  process_api_response response, request, result
446
435
  }
447
436
  end
448
437
 
449
- def create_nw(nw_hash)
438
+ def create_nw(domain, nw_hash)
450
439
  json = to_json(nw_hash)
451
- domain_id = nw_hash[:domain_id]
452
- @api["/api/xcr/v2/domains/#{domain_id}/nws"].post(json, @headers) {|response, request, result|
440
+ @api["/api/xcr/v3/domains/#{domain}/nws"].post(json, @headers) { |response, request, result|
453
441
  process_api_response response, request, result
454
442
  }
455
443
  end
456
444
 
457
445
  def update_nw(network_cidr, nw_hash)
458
446
  json = to_json(nw_hash)
459
- @api["/api/xcr/v2/nws/#{network_cidr}"].put(json, @headers) {|response, request, result|
447
+ @api["/api/xcr/v3/nws/#{network_cidr}"].put(json, @headers) { |response, request, result|
460
448
  process_api_response response, request, result
461
449
  }
462
450
  end
463
451
 
464
452
  def get_nw(network_cidr)
465
- @api["/api/xcr/v2/nws/#{network_cidr}"].get(@headers) {|response, request, result|
453
+ @api["/api/xcr/v3/nws/#{network_cidr}"].get(@headers) { |response, request, result|
466
454
  process_api_response response, request, result
467
455
  }
468
456
  end
469
457
 
470
- def list_nw_connections(domain_id, network_cidr, file = nil)
471
- @api["/api/xcr/v2/domains/#{domain_id}/nws/#{network_cidr}/cxns"].get(@headers) {|response, request, result|
458
+ def list_nw_connections(network_cidr, file = nil)
459
+ @api["/api/xcr/v3/nws/#{network_cidr}/cxns"].get(@headers) { |response, request, result|
472
460
  process_api_response response, request, result
473
461
  }
474
462
  end
475
463
 
476
464
  def list_endpoint_events(ipv6)
477
- @api["/api/xcr/v2/cxns/#{ipv6}/events"].get(@headers) {|response, request, result|
465
+ @api["/api/xcr/v3/cxns/#{ipv6}/events"].get(@headers) { |response, request, result|
478
466
  process_api_response response, request, result
479
467
  }
480
468
  end
481
469
 
482
470
  def list_network_events(network_cidr)
483
- @api["/api/xcr/v2/nws/#{network_cidr}/events"].get(@headers) {|response, request, result|
471
+ @api["/api/xcr/v3/nws/#{network_cidr}/events"].get(@headers) { |response, request, result|
484
472
  process_api_response response, request, result
485
473
  }
486
474
  end
487
475
 
488
476
  def get_endpoint(ipv6)
489
- @api["/api/xcr/v2/cxns/#{ipv6}"].get(@headers) {|response, request, result|
477
+ @api["/api/xcr/v3/cxns/#{ipv6}"].get(@headers) { |response, request, result|
490
478
  process_api_response response, request, result
491
479
  }
492
480
  end
493
481
 
494
482
  def update_endpoint(ipv6, name)
495
- hash = { :ipv6 => ipv6, :name => name }
496
- json = to_json( hash )
483
+ hash = { ipv6: ipv6, name: name }
484
+ json = to_json(hash)
497
485
 
498
- @api["/api/xcr/v2/cxns/#{ipv6}"].put( json, @headers) {|response, request, result|
486
+ @api["/api/xcr/v3/cxns/#{ipv6}"].put(json, @headers) { |response, request, result|
499
487
  process_api_response response, request, result
500
488
  }
501
489
  end
502
490
 
503
491
  def activate_enfnw(subnet)
504
- @api["/api/xcr/v2/enfnws/#{subnet}"].put( '', @headers) {|response, request, result|
505
- process_api_response response, request, result
506
- }
507
- end
508
-
509
- def list_domain_users(domain_network)
510
- @api["/api/xcr/v2/domains/#{domain_network}/users"].get( @headers) {|response, request, result|
511
- process_api_response response, request, result
512
- }
513
- end
514
-
515
- def list_domain_invites(domain_network)
516
- @api["/api/xcr/v2/domains/#{domain_network}/invites"].get(@headers) {|response, request, result|
517
- process_api_response response, request, result
518
- }
519
- end
520
-
521
- def invite(domain_network, hash)
522
- json = to_json( hash )
523
- @api["/api/xcr/v2/domains/#{domain_network}/invites"].post( json, @headers) { |response, request, result|
524
- process_api_response response, request, result
525
- }
526
- end
527
-
528
- def cancel_invite(email)
529
- @api["/api/xcr/v2/invites/#{email}"].delete( @headers) {|response, request, result|
530
- process_api_response response, request, result
531
- }
532
- end
533
-
534
- def resend_invite(email)
535
- @api["/api/xcr/v2/invites/#{email}"].put( "{}", @headers) {|response, request, result|
536
- process_api_response response, request, result
537
- }
538
- end
539
-
540
- def update_user_status(user_id, status)
541
- json = to_json( status )
542
- @api["/api/xcr/v2/users/#{user_id}/status"].put( json, @headers) { |response, request, result|
492
+ @api["/api/xcr/v3/enfnws/#{subnet}"].put("", @headers) { |response, request, result|
543
493
  process_api_response response, request, result
544
494
  }
545
495
  end
546
496
 
547
- ############################################################################################################################
548
- # Private functions
549
- ############################################################################################################################
497
+ ############################################################################################################################
498
+ # Private functions
499
+ ############################################################################################################################
550
500
  def process_api_response(response, request, result)
551
501
  case response.code
552
- when 200
553
- # return json
554
- from_json(response.body)
555
-
556
- when 201
557
- # return response body
558
- from_json(response.body)
559
-
560
- when 400
561
- # api returns and error
502
+ when 200
503
+ # return json
504
+ from_json(response.body)
505
+ when 201
506
+ # return response body
507
+ from_json(response.body)
508
+ when 400
509
+ # api returns and error
510
+ raise EnfApi::ERROR, api_error_msg(from_json(response.body))
511
+ when 401
512
+ # api returns and error
513
+ raise EnfApi::ERROR, api_error_msg(from_json(response.body))
514
+ when 403
515
+ # api returns and error
516
+ raise EnfApi::ERROR, "AUTHORIZATION_ERROR: User is not authorized to perform this operation!"
517
+ when 404
518
+ # api returns an error
519
+ # for the 404, we're going to check if it is JSON before parsing the
520
+ # error message
521
+ begin
522
+ JSON.parse(response.body)
562
523
  raise EnfApi::ERROR, api_error_msg(from_json(response.body))
563
-
564
- when 401
565
- # api returns and error
524
+ rescue JSON::ParserError => e
525
+ raise EnfApi::ERROR, "Not Found"
526
+ end
527
+ when 500
528
+ begin
529
+ JSON.parse(response.body)
566
530
  raise EnfApi::ERROR, api_error_msg(from_json(response.body))
567
-
568
- when 403
569
- # api returns and error
570
- raise EnfApi::ERROR, "AUTHORIZATION_ERROR: User is not authorized to perform this operation!"
571
-
572
- when 404
573
- # api returns an error
574
- # for the 404, we're going to check if it is JSON before parsing the
575
- # error message
576
- begin
577
- JSON.parse(response.body)
578
- raise EnfApi::ERROR, api_error_msg(from_json(response.body))
579
- rescue JSON::ParserError => e
580
- raise EnfApi::ERROR, "Not Found"
581
- end
582
-
583
- else
584
- raise EnfApi::ERROR, "Unexpected error! Please try again!"
531
+ rescue JSON::ParserError => e
532
+ raise EnfApi::ERROR, "Server error was received without details."
533
+ end
534
+ else
535
+ raise EnfApi::ERROR, "Unexpected error! Please try again!"
585
536
  end
586
537
  end
587
538
 
588
539
  def from_json(string)
589
- begin
590
- JSON.parse(string, {:symbolize_names => true})
591
- rescue
592
- raise EnfApi::ERROR, "Unable to parse api response json!"
593
- end
540
+ EnfApi::from_json(string)
594
541
  end
595
542
 
596
543
  def to_json(hash)
597
- JSON.generate(hash)
544
+ EnfApi::to_json(hash)
598
545
  end
599
546
 
600
547
  def api_error_msg(err)