cyclid-client 0.3.3 → 0.4.0

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: eb286d1fdb3a5a900ad24f35c41fff997b9403eb
4
- data.tar.gz: d62a803b0a9597605906bedc394a1277d9e9bf45
3
+ metadata.gz: 078b4e179f24bb0cd378bcd6993fd834bdcb4555
4
+ data.tar.gz: 0abab651a16850f267229149a11ebd59e58b089e
5
5
  SHA512:
6
- metadata.gz: 8f5a28f869c93715ff81ff3e25da32bf088f9a2ca417a78708a9845aa6ab7312a8decafd3dd8e688888bc1a2ed70e99f0b3e66b909172843dc626614489f3916
7
- data.tar.gz: 614077b06d871c421644adc3ccd0ad10af187521a6afb6a35bfcfe84d697fe46183750d1f4490b7f9568266a4e2176b5c0f79c86b57fa9aa648c178a10e9d1cb
6
+ metadata.gz: 6635460d43ba93794cf903263d3b0f6341965b79cdd17ef5b1f5c06b5a42df653205c0c997039198a88f55c1ba143397c7f03f70037208e2db305cbf17108026
7
+ data.tar.gz: 696dd68c6329ac1159616b6174445543ab0c9ee162e2b1f0c9404a3401cdea245b505eed71e76d5c4eecea013f77707f71d84316289ae801ada9b711a495672b
@@ -28,6 +28,9 @@ module Cyclid
28
28
  desc 'organization', 'Manage organizations'
29
29
  subcommand 'organization', AdminOrganization
30
30
  map 'org' => :organization
31
+
32
+ desc 'job', 'Manage jobs'
33
+ subcommand 'job', AdminJob
31
34
  end
32
35
  end
33
36
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+ # Copyright 2016 Liqwyd Ltd.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ module Cyclid
17
+ module Cli
18
+ # 'admin job' sub-commands
19
+ class AdminJob < Thor
20
+ desc 'list NAME', 'List all jobs for the organization NAME'
21
+ def list(name)
22
+ stats = client.job_stats(name)
23
+ all = client.job_list(name, limit: stats['total'])
24
+ jobs = all['records']
25
+
26
+ jobs.each do |job|
27
+ Formatter.colorize 'Name', (job['job_name'] || '')
28
+ Formatter.colorize "\tJob", job['id'].to_s
29
+ Formatter.colorize "\tVersion", (job['job_version'] || '')
30
+ end
31
+ rescue StandardError => ex
32
+ abort "Failed to get job list: #{ex}"
33
+ end
34
+
35
+ desc 'stats NAME', 'Show statistics about jobs for the organization NAME'
36
+ def stats(name)
37
+ stats = client.job_stats(name)
38
+
39
+ Formatter.colorize 'Total jobs', stats['total'].to_s
40
+ rescue StandardError => ex
41
+ abort "Failed to get job list: #{ex}"
42
+ end
43
+ end
44
+ end
45
+ end
@@ -36,16 +36,16 @@ module Cyclid
36
36
  public_key = OpenSSL::PKey::RSA.new(der_key)
37
37
 
38
38
  # Pretty print the organization details
39
- puts 'Name: '.colorize(:cyan) + org['name']
40
- puts 'Owner Email: '.colorize(:cyan) + org['owner_email']
41
- puts 'Public Key: '.colorize(:cyan) + public_key.to_pem
42
- puts 'Members:'.colorize(:cyan)
39
+ Formatter.colorize 'Name', org['name']
40
+ Formatter.colorize 'Owner Email', org['owner_email']
41
+ Formatter.colorize 'Public Key', public_key.to_pem
42
+ Formatter.colorize 'Members:'
43
43
  if org['users'].any?
44
44
  org['users'].each do |user|
45
- puts "\t#{user}"
45
+ Formatter.puts "\t#{user}"
46
46
  end
47
47
  else
48
- puts "\tNone"
48
+ Formatter.puts "\tNone"
49
49
  end
50
50
  rescue StandardError => ex
51
51
  abort "Failed to get organization: #{ex}"
@@ -107,7 +107,7 @@ module Cyclid
107
107
  if options[:force]
108
108
  delete = true
109
109
  else
110
- print "Delete organization #{name}: are you sure? (Y/n): ".colorize(:red)
110
+ Formatter.ask "Delete organization #{name}: are you sure? (Y/n)"
111
111
  delete = STDIN.getc.chr.casecmp('y').zero?
112
112
  end
113
113
  abort unless delete
@@ -32,16 +32,16 @@ module Cyclid
32
32
  user = client.user_get(username)
33
33
 
34
34
  # Pretty print the user details
35
- puts 'Username: '.colorize(:cyan) + user['username']
36
- puts 'Name: '.colorize(:cyan) + (user['name'] || '')
37
- puts 'Email: '.colorize(:cyan) + user['email']
38
- puts 'Organizations:'.colorize(:cyan)
35
+ Formatter.colorize 'Username', user['username']
36
+ Formatter.colorize 'Name', (user['name'] || '')
37
+ Formatter.colorize 'Email', user['email']
38
+ Formatter.colorize 'Organizations:'
39
39
  if user['organizations'].any?
40
40
  user['organizations'].each do |org|
41
- puts "\t#{org}"
41
+ Formatter.puts "\t#{org}"
42
42
  end
43
43
  else
44
- puts "\tNone"
44
+ Formatter.puts "\tNone"
45
45
  end
46
46
  rescue StandardError => ex
47
47
  abort "Failed to get user: #{ex}"
@@ -127,7 +127,7 @@ module Cyclid
127
127
  if options[:force]
128
128
  delete = true
129
129
  else
130
- print "Delete user #{username}: are you sure? (Y/n): ".colorize(:red)
130
+ Formatter.ask "Delete user #{username}: are you sure? (Y/n)"
131
131
  delete = STDIN.getc.chr.casecmp('y').zero?
132
132
  end
133
133
  abort unless delete
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+ # Copyright 2016 Liqwyd Ltd.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require 'colorize'
17
+
18
+ module Cyclid
19
+ module Cli
20
+ # Output formatter
21
+ module Formatter
22
+ # Output with no additional formatting
23
+ class Base
24
+ class << self
25
+ def puts(title, *args)
26
+ t = if args.empty?
27
+ title
28
+ else
29
+ "#{title}: "
30
+ end
31
+ Kernel.puts t + args.join
32
+ end
33
+ alias colorize puts
34
+
35
+ def ask(question)
36
+ print "#{question}: "
37
+ end
38
+ end
39
+ end
40
+
41
+ # Output with XTerm compatible color
42
+ class Terminal < Base
43
+ class << self
44
+ def colorize(title, *args)
45
+ t = if args.empty?
46
+ title
47
+ else
48
+ "#{title}: "
49
+ end
50
+ Kernel.puts t.colorize(:cyan) + args.join
51
+ end
52
+
53
+ def ask(question)
54
+ print "#{question}: ".colorize(:red)
55
+ end
56
+ end
57
+ end
58
+
59
+ class << self
60
+ def method_missing(method, *args, &block) # rubocop:disable Style/MethodMissing
61
+ @formatter ||= get
62
+ @formatter.send(method, *args, &block)
63
+ end
64
+
65
+ private
66
+
67
+ def get
68
+ STDOUT.tty? ? Terminal : Base
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -63,7 +63,7 @@ module Cyclid
63
63
  end
64
64
 
65
65
  job_info = client.job_submit(client.config.organization, job, job_type)
66
- puts 'Job: '.colorize(:cyan) + job_info['job_id'].to_s
66
+ Formatter.colorize 'Job', job_info['job_id'].to_s
67
67
  rescue StandardError => ex
68
68
  abort "Failed to submit job: #{ex}"
69
69
  end
@@ -78,13 +78,17 @@ module Cyclid
78
78
  started = job['started'].nil? ? nil : Time.parse(job['started'])
79
79
  ended = job['ended'].nil? ? nil : Time.parse(job['ended'])
80
80
 
81
+ # Calculate the duration if the job contains a valid start & end time
82
+ duration = (Time.new(0) + (ended - started) if started && ended)
83
+
81
84
  # Pretty-print the job details (without the log)
82
- puts 'Job: '.colorize(:cyan) + job['id'].to_s
83
- puts 'Name: '.colorize(:cyan) + (job['job_name'] || '')
84
- puts 'Version: '.colorize(:cyan) + (job['job_version'] || '')
85
- puts 'Started: '.colorize(:cyan) + (started ? started.asctime : '')
86
- puts 'Ended: '.colorize(:cyan) + (ended ? ended.asctime : '')
87
- puts 'Status: '.colorize(:cyan) + status
85
+ Formatter.colorize 'Job', job['id'].to_s
86
+ Formatter.colorize 'Name', (job['job_name'] || '')
87
+ Formatter.colorize 'Version', (job['job_version'] || '')
88
+ Formatter.colorize 'Started', (started ? started.asctime : '')
89
+ Formatter.colorize 'Ended', (ended ? ended.asctime : '')
90
+ Formatter.colorize 'Duration', duration.strftime('%H:%M:%S') if duration
91
+ Formatter.colorize 'Status', status
88
92
  rescue StandardError => ex
89
93
  abort "Failed to get job status: #{ex}"
90
94
  end
@@ -97,7 +101,7 @@ module Cyclid
97
101
  status = Cyclid::API::Constants::JOB_STATUSES[status_id]
98
102
 
99
103
  # Pretty-print the job status
100
- puts 'Status: '.colorize(:cyan) + status
104
+ Formatter.colorize 'Status', status
101
105
  rescue StandardError => ex
102
106
  abort "Failed to get job status: #{ex}"
103
107
  end
@@ -110,6 +114,30 @@ module Cyclid
110
114
  rescue StandardError => ex
111
115
  abort "Failed to get job log: #{ex}"
112
116
  end
117
+
118
+ desc 'list', 'List all jobs'
119
+ def list
120
+ stats = client.job_stats(client.config.organization)
121
+ all = client.job_list(client.config.organization, limit: stats['total'])
122
+ jobs = all['records']
123
+
124
+ jobs.each do |job|
125
+ Formatter.colorize 'Name', (job['job_name'] || '')
126
+ Formatter.colorize "\tJob", job['id'].to_s
127
+ Formatter.colorize "\tVersion", (job['job_version'] || '')
128
+ end
129
+ rescue StandardError => ex
130
+ abort "Failed to get job list: #{ex}"
131
+ end
132
+
133
+ desc 'stats', 'Show statistics about jobs'
134
+ def stats
135
+ stats = client.job_stats(client.config.organization)
136
+
137
+ Formatter.colorize 'Total jobs', stats['total'].to_s
138
+ rescue StandardError => ex
139
+ abort "Failed to get job list: #{ex}"
140
+ end
113
141
  end
114
142
  end
115
143
  end
@@ -31,10 +31,10 @@ module Cyclid
31
31
  public_key = OpenSSL::PKey::RSA.new(der_key)
32
32
 
33
33
  # Pretty print the organization details
34
- puts 'Name: '.colorize(:cyan) + org['name']
35
- puts 'Owner Email: '.colorize(:cyan) + org['owner_email']
36
- puts 'Public Key: '.colorize(:cyan) + public_key.to_pem
37
- puts 'Members:'.colorize(:cyan)
34
+ Formatter.colorize 'Name', org['name']
35
+ Formatter.colorize 'Owner Email', org['owner_email']
36
+ Formatter.colorize 'Public Key', public_key.to_pem
37
+ Formatter.colorize 'Members'
38
38
  if org['users'].any?
39
39
  org['users'].each do |user|
40
40
  puts "\t#{user}"
@@ -70,11 +70,12 @@ module Cyclid
70
70
  # Create a Config from this file and display the details
71
71
  config = Cyclid::Client::Config.new(path: fname)
72
72
 
73
- puts File.basename(fname).colorize(:cyan)
74
- uri = URI::HTTP.build(host: config.server, port: config.port)
75
- puts "\tServer: ".colorize(:cyan) + uri.to_s
76
- puts "\tOrganization: ".colorize(:cyan) + config.organization
77
- puts "\tUsername: ".colorize(:cyan) + config.username
73
+ Formatter.colorize File.basename(fname)
74
+ scheme = config.tls ? URI::HTTPS : URI::HTTP
75
+ uri = scheme.build(host: config.server, port: config.port)
76
+ Formatter.colorize "\tURL", uri.to_s
77
+ Formatter.colorize "\tOrganization", config.organization
78
+ Formatter.colorize "\tUsername", config.username
78
79
  rescue StandardError => ex
79
80
  $stderr.puts "Failed to load config file #{fname}: #{ex}"
80
81
  end
@@ -114,7 +115,7 @@ module Cyclid
114
115
  # The configuration file exists and appears to be sane, so switch the
115
116
  # 'config' symlink to point to it.
116
117
  Dir.chdir(CYCLID_CONFIG_DIR) do
117
- File.delete('config')
118
+ File.delete('config') if File.exist?('config')
118
119
  File.symlink(name, 'config')
119
120
  end
120
121
  end
@@ -30,32 +30,32 @@ module Cyclid
30
30
  case type
31
31
  when 'string', 'integer'
32
32
  data = config[name] || 'Not set'
33
- puts "#{setting['description']}: ".colorize(:cyan) + data
33
+ Formatter.colorize setting['description'], data
34
34
  when 'password'
35
35
  data = config[name] ? '*' * config[name].length : 'Not set'
36
- puts "#{setting['description']}: ".colorize(:cyan) + data
36
+ Formatter.colorize setting['description'], data
37
37
  when 'boolean'
38
38
  data = config[name] || 'Not set'
39
- puts "#{setting['description']}: ".colorize(:cyan) + (data ? 'true' : 'false')
39
+ Formatter.colorize setting['description'], (data ? 'true' : 'false')
40
40
  when 'list'
41
- puts setting['description'].colorize(:cyan)
41
+ Formatter.colorize setting['description']
42
42
  data = config[name]
43
43
  if data.empty?
44
- puts "\tNone"
44
+ Formatter.puts "\tNone"
45
45
  else
46
46
  data.each do |item|
47
- puts "\t#{item}"
47
+ Formatter.puts "\t#{item}"
48
48
  end
49
49
  end
50
50
  when 'hash-list'
51
- puts setting['description'].colorize(:cyan)
51
+ Formatter.colorize setting['description']
52
52
  data = config[name]
53
53
  if data.empty?
54
- puts "\tNone"
54
+ Formatter.puts "\tNone"
55
55
  else
56
56
  data.each do |item|
57
57
  item.each do |k, v|
58
- puts "\t#{k}: #{v}"
58
+ Formatter.puts "\t#{k}: #{v}"
59
59
  end
60
60
  end
61
61
  end
@@ -82,11 +82,11 @@ module Cyclid
82
82
  user = client.org_user_get(client.config.organization, user)
83
83
 
84
84
  # Pretty print the user details
85
- puts 'Username: '.colorize(:cyan) + user['username']
86
- puts 'Email: '.colorize(:cyan) + user['email']
87
- puts 'Permissions'.colorize(:cyan)
85
+ Formatter.colorize 'Username', user['username']
86
+ Formatter.colorize 'Email: ', user['email']
87
+ Formatter.colorize 'Permissions'
88
88
  user['permissions'].each do |k, v|
89
- puts "\t#{k.capitalize}: ".colorize(:cyan) + v.to_s
89
+ Formatter.colorize "\t#{k.capitalize}", v.to_s
90
90
  end
91
91
  rescue StandardError => ex
92
92
  abort "Failed to get user: #{ex}"
@@ -110,7 +110,7 @@ module Cyclid
110
110
  if options[:force]
111
111
  true
112
112
  else
113
- print "Remove user #{user}: are you sure? (Y/n): ".colorize(:red)
113
+ Formatter.ask "Remove user #{user}: are you sure? (Y/n)"
114
114
  STDIN.getc.chr.casecmp('y').zero?
115
115
  end
116
116
  end
@@ -34,7 +34,7 @@ module Cyclid
34
34
  # Encrypt with the public key
35
35
  encrypted = public_key.public_encrypt(secret)
36
36
 
37
- puts 'Secret: '.colorize(:cyan) + Base64.strict_encode64(encrypted)
37
+ Formatter.colorize 'Secret', Base64.strict_encode64(encrypted)
38
38
  rescue StandardError => ex
39
39
  abort "Failed to encrypt secret: #{ex}"
40
40
  end
@@ -21,7 +21,7 @@ module Cyclid
21
21
  def list
22
22
  stages = client.stage_list(client.config.organization)
23
23
  stages.each do |stage|
24
- puts "#{stage[:name]} v#{stage[:version]}"
24
+ Formatter.puts "#{stage[:name]} v#{stage[:version]}"
25
25
  end
26
26
  rescue StandardError => ex
27
27
  abort "Failed to get stages: #{ex}"
@@ -33,14 +33,14 @@ module Cyclid
33
33
 
34
34
  # Pretty print the stage details
35
35
  stages.each do |stage|
36
- puts 'Name: '.colorize(:cyan) + stage['name']
37
- puts 'Version: '.colorize(:cyan) + stage['version']
38
- puts 'Steps'.colorize(:cyan)
36
+ Formatter.colorize 'Name', stage['name']
37
+ Formatter.colorize 'Version', stage['version']
38
+ Formatter.colorize 'Steps'
39
39
  stage['steps'].each do |step|
40
- puts "\t\tAction: ".colorize(:cyan) + step['action']
40
+ Formatter.colorize"\t\tAction", step['action']
41
41
  step.delete('action')
42
42
  step.each do |k, v|
43
- puts "\t\t#{k.capitalize}: ".colorize(:cyan) + v.to_s
43
+ Formatter.colorize "\t\t#{k.capitalize}: ", v.to_s
44
44
  end
45
45
  end
46
46
  end
@@ -25,16 +25,16 @@ module Cyclid
25
25
  user = client.user_get(client.config.username)
26
26
 
27
27
  # Pretty print the user details
28
- puts 'Username: '.colorize(:cyan) + user['username']
29
- puts 'Name: '.colorize(:cyan) + (user['name'] || '')
30
- puts 'Email: '.colorize(:cyan) + user['email']
31
- puts 'Organizations'.colorize(:cyan)
28
+ Formatter.colorize 'Username', user['username']
29
+ Formatter.colorize 'Name', (user['name'] || '')
30
+ Formatter.colorize 'Email', user['email']
31
+ Formatter.colorize 'Organizations'
32
32
  if user['organizations'].any?
33
33
  user['organizations'].each do |org|
34
- puts "\t#{org}"
34
+ Formatter.puts "\t#{org}"
35
35
  end
36
36
  else
37
- puts "\tNone"
37
+ Formatter.puts "\tNone"
38
38
  end
39
39
  rescue StandardError => ex
40
40
  abort "Failed to get user: #{ex}"
@@ -80,6 +80,62 @@ module Cyclid
80
80
  abort "Failed to modify user: #{ex}"
81
81
  end
82
82
  end
83
+
84
+ desc 'authenticate', 'Authenticate your client with a server'
85
+ long_desc <<-LONGDESC
86
+ Authenticate against a Cyclid server with your username & password and
87
+ create your client configuration files.
88
+
89
+ The --server option sets the Cyclid server URL. The default is 'https://api.cyclid.io'
90
+
91
+ The --username option sets your username to authenticate with.
92
+ LONGDESC
93
+
94
+ option :server, aliases: '-s'
95
+ option :username, aliases: '-u'
96
+ def authenticate
97
+ url = options[:server] || 'https://api.cyclid.io'
98
+ username = options[:username]
99
+
100
+ # Get the username if one wasn't provided
101
+ if username.nil?
102
+ print 'Username: '
103
+ username = STDIN.gets.chomp
104
+ end
105
+
106
+ # Get the users password
107
+ print 'Password: '
108
+ password = STDIN.noecho(&:gets).chomp
109
+ puts
110
+
111
+ # Create a client that can authenticate with HTTP BASIC
112
+ Formatter.colorize "Authenticating #{username} with #{url}"
113
+
114
+ basic_client = Cyclid::Client::Tilapia.new(auth: Cyclid::Client::AuthMethods::AUTH_BASIC,
115
+ url: url,
116
+ username: username,
117
+ password: password,
118
+ log_level: debug?)
119
+
120
+ # Get the user information
121
+ user = basic_client.user_get(username)
122
+
123
+ # Ensure the configuration directory exists
124
+ Dir.mkdir(CYCLID_CONFIG_DIR, 0o700) unless Dir.exist? CYCLID_CONFIG_DIR
125
+
126
+ # Generate a configuration file for each organization
127
+ user['organizations'].each do |org|
128
+ Formatter.colorize "Creating configuration file for organization #{org}"
129
+
130
+ org_config = File.new(File.join(CYCLID_CONFIG_DIR, org), 'w+', 0o600)
131
+ org_config.write "url: #{url}\n"
132
+ org_config.write "organization: #{org}\n"
133
+ org_config.write "username: #{username}\n"
134
+ org_config.write "secret: #{user['secret']}\n"
135
+ end
136
+ rescue StandardError => ex
137
+ abort "Failed to authenticate user: #{ex}"
138
+ end
83
139
  end
84
140
  end
85
141
  end
data/lib/cyclid/client.rb CHANGED
@@ -83,10 +83,12 @@ module Cyclid
83
83
  private
84
84
 
85
85
  # Build a URI for the configured server & required resource
86
- def server_uri(path)
87
- URI::HTTP.build(host: @config.server,
88
- port: @config.port,
89
- path: path)
86
+ def server_uri(path, query = nil)
87
+ scheme = @config.tls ? URI::HTTPS : URI::HTTP
88
+ scheme.build(host: @config.server,
89
+ port: @config.port,
90
+ path: URI.escape(path),
91
+ query: query ? URI.escape(query) : nil)
90
92
  end
91
93
 
92
94
  def method_missing(method, *args, &block) # rubocop:disable Style/MethodMissing
@@ -79,6 +79,8 @@ module Cyclid
79
79
  # Perform an API HTTP request & return the parsed response body
80
80
  def api_request(uri, req)
81
81
  http = Net::HTTP.new(uri.hostname, uri.port)
82
+ http.use_ssl = uri.scheme == 'https'
83
+
82
84
  res = http.request(req)
83
85
 
84
86
  parse_response(res)
@@ -84,6 +84,25 @@ module Cyclid
84
84
 
85
85
  return res_data
86
86
  end
87
+
88
+ def job_stats(organization)
89
+ uri = server_uri("/organizations/#{organization}/jobs", 'stats_only=true')
90
+ res_data = api_get(uri)
91
+ @logger.debug res_data
92
+
93
+ return res_data
94
+ end
95
+
96
+ def job_list(organization, args = {})
97
+ # Convert the args hash into a query string
98
+ query = args.map { |k, v| "#{k}=#{v}" }.join('&')
99
+
100
+ uri = server_uri("/organizations/#{organization}/jobs", query)
101
+ res_data = api_get(uri)
102
+ @logger.debug res_data
103
+
104
+ return res_data
105
+ end
87
106
  end
88
107
  end
89
108
  end
data/lib/cyclid/config.rb CHANGED
@@ -14,13 +14,23 @@
14
14
  # limitations under the License.
15
15
 
16
16
  require 'yaml'
17
+ require 'uri'
17
18
  require 'cyclid/auth_methods'
18
19
 
19
20
  module Cyclid
20
21
  module Client
21
22
  # Cyclid client per-organization configuration
22
23
  class Config
23
- attr_reader :auth, :server, :port, :organization, :username, :secret, :password, :token, :path
24
+ attr_reader :auth,
25
+ :server,
26
+ :port,
27
+ :tls,
28
+ :organization,
29
+ :username,
30
+ :secret,
31
+ :password,
32
+ :token,
33
+ :path
24
34
  # @!attribute [r] auth
25
35
  # @return [Fixnum] the authentication method. (Default is AUTH_HMAC)
26
36
  # @!attribute [r] server
@@ -71,19 +81,34 @@ module Cyclid
71
81
  end
72
82
 
73
83
  # Set defaults from the options
84
+ @url = options[:url] || nil
74
85
  @server = options[:server] || nil
75
86
  @port = options[:port] || nil
87
+ @tls = options[:tls] || nil
76
88
  @organization = options[:organization] || nil
77
89
  @username = options[:username] || nil
78
90
 
79
91
  # Get anything provided in the config file
80
92
  if @config
93
+ @url ||= @config['url']
81
94
  @server ||= @config['server']
82
95
  @port ||= @config['port'] || 8361
96
+ @tls ||= @config['tls'] || false
83
97
  @organization ||= @config['organization']
84
98
  @username ||= @config['username']
85
99
  end
86
100
 
101
+ # Parse the URL if one was given
102
+ if @url
103
+ uri = URI.parse(@url)
104
+
105
+ # Items parsed from the uri always over-write any individual
106
+ # configuration settings
107
+ @server = uri.host
108
+ @port = uri.port
109
+ @tls = uri.scheme == 'https' ? true : false
110
+ end
111
+
87
112
  # Server & Username *must* be set
88
113
  raise 'server address must be provided' if @server.nil?
89
114
  raise 'username must be provided' if @username.nil? and @auth != AUTH_NONE
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module Cyclid
3
3
  module Client
4
- VERSION = '0.3.3'
4
+ VERSION = '0.4.0'
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cyclid-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kristian Van Der Vliet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-10 00:00:00.000000000 Z
11
+ date: 2017-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -108,8 +108,10 @@ files:
108
108
  - lib/cyclid/auth_methods.rb
109
109
  - lib/cyclid/cli.rb
110
110
  - lib/cyclid/cli/admin.rb
111
+ - lib/cyclid/cli/admin/job.rb
111
112
  - lib/cyclid/cli/admin/organization.rb
112
113
  - lib/cyclid/cli/admin/user.rb
114
+ - lib/cyclid/cli/formatter.rb
113
115
  - lib/cyclid/cli/job.rb
114
116
  - lib/cyclid/cli/organization.rb
115
117
  - lib/cyclid/cli/organization/config.rb