idcfcloud 0.1.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.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +21 -0
  3. data/.gitignore +56 -0
  4. data/.rubocop.yml +26 -0
  5. data/Gemfile +7 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +91 -0
  8. data/Rakefile +8 -0
  9. data/bin/idcfcloud +17 -0
  10. data/config/config_sample.ini +16 -0
  11. data/exe/idcfcloud +4 -0
  12. data/idcfcloud.gemspec +43 -0
  13. data/lib/idcf/cli/conf/conf.yml +10 -0
  14. data/lib/idcf/cli/conf/const.rb +37 -0
  15. data/lib/idcf/cli/conf/service/.gitkeep +0 -0
  16. data/lib/idcf/cli/controller/base.rb +151 -0
  17. data/lib/idcf/cli/controller/extend/command.rb +48 -0
  18. data/lib/idcf/cli/controller/extend/init.rb +17 -0
  19. data/lib/idcf/cli/controller/extend/override.rb +21 -0
  20. data/lib/idcf/cli/controller/extend/search_module.rb +54 -0
  21. data/lib/idcf/cli/controller/ilb.rb +62 -0
  22. data/lib/idcf/cli/controller/include/command.rb +106 -0
  23. data/lib/idcf/cli/controller/include/init.rb +21 -0
  24. data/lib/idcf/cli/controller/include/override.rb +30 -0
  25. data/lib/idcf/cli/controller/include/sdk.rb +83 -0
  26. data/lib/idcf/cli/controller/include/util.rb +101 -0
  27. data/lib/idcf/cli/controller/include/validate.rb +79 -0
  28. data/lib/idcf/cli/controller/your.rb +57 -0
  29. data/lib/idcf/cli/error/cli_error.rb +11 -0
  30. data/lib/idcf/cli/extend/configure.rb +71 -0
  31. data/lib/idcf/cli/extend/init.rb +13 -0
  32. data/lib/idcf/cli/extend/update.rb +109 -0
  33. data/lib/idcf/cli/extend/update_file.rb +53 -0
  34. data/lib/idcf/cli/gem_ext/thor/init_util.rb +92 -0
  35. data/lib/idcf/cli/index.rb +71 -0
  36. data/lib/idcf/cli/lib/convert/formatter/base.rb +21 -0
  37. data/lib/idcf/cli/lib/convert/formatter/csv_format.rb +115 -0
  38. data/lib/idcf/cli/lib/convert/formatter/json_format.rb +19 -0
  39. data/lib/idcf/cli/lib/convert/formatter/table_format.rb +19 -0
  40. data/lib/idcf/cli/lib/convert/formatter/xml_format.rb +21 -0
  41. data/lib/idcf/cli/lib/convert/helper.rb +28 -0
  42. data/lib/idcf/cli/lib/util/ini_conf.rb +67 -0
  43. data/lib/idcf/cli/lib/util/template.rb +29 -0
  44. data/lib/idcf/cli/lib/util/yml_conf.rb +37 -0
  45. data/lib/idcf/cli/service/base.rb +56 -0
  46. data/lib/idcf/cli/service/ilb/add_server_for_protocol.rb +20 -0
  47. data/lib/idcf/cli/service/ilb/base_server_for_protocol.rb +111 -0
  48. data/lib/idcf/cli/service/ilb/delete_server_for_protocol.rb +29 -0
  49. data/lib/idcf/cli/templates/bash/complement.erb +37 -0
  50. data/lib/idcf/cli/templates/zsh/complement.erb +46 -0
  51. data/lib/idcf/cli/validate/custom/init.rb +14 -0
  52. data/lib/idcf/cli/validate/custom/month_check_validator.rb +39 -0
  53. data/lib/idcf/cli/validate/custom/require_relation_validator.rb +50 -0
  54. data/lib/idcf/cli/validate/define/base.rb +36 -0
  55. data/lib/idcf/cli/validate/define/ilb/base.rb +27 -0
  56. data/lib/idcf/cli/version.rb +5 -0
  57. metadata +317 -0
@@ -0,0 +1,62 @@
1
+ require_relative './base'
2
+ require 'idcf/ilb'
3
+
4
+ module Idcf
5
+ module Cli
6
+ module Controller
7
+ # ILB
8
+ class Ilb < Base
9
+ default_command :help
10
+
11
+ class_option :region,
12
+ type: :string,
13
+ aliases: '-r',
14
+ require: true,
15
+ desc: "region: #{Idcf::Cli::Conf::Const::REGIONS.join('/')}"
16
+
17
+ class << self
18
+ def description
19
+ 'ILB Service'
20
+ end
21
+
22
+ def make_blank_client
23
+ Idcf::Ilb::Client.new(
24
+ api_key: '',
25
+ secret_key: ''
26
+ )
27
+ end
28
+ end
29
+
30
+ protected
31
+
32
+ def resource_classes
33
+ [
34
+ Idcf::Ilb::Response,
35
+ Idcf::Ilb::Resources::Base
36
+ ]
37
+ end
38
+
39
+ def responce_classes
40
+ [
41
+ Idcf::Ilb::Response
42
+ ]
43
+ end
44
+
45
+ # Create a new client
46
+ # @param o [Hash] other options
47
+ # @return [Response] Idcf::Ilb::Client
48
+ def make_client(o)
49
+ region = get_region(o)
50
+ option = {
51
+ host: get_code_conf("ilb.v1.host.#{region}", o),
52
+ ssl: o.key?(:no_ssl) ? false : true,
53
+ verify_ssl: o.key?(:no_vssl) ? false : true
54
+ }
55
+ option.merge!(base_options(o))
56
+
57
+ Idcf::Ilb::Client.new(option)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,106 @@
1
+ require 'idcf/cli/conf/const'
2
+ module Idcf
3
+ module Cli
4
+ module Controller
5
+ module Include
6
+ # command
7
+ module Command
8
+ include Comparable
9
+
10
+ protected
11
+
12
+ def convert_arg_json(*args)
13
+ result = []
14
+ args.each do |v|
15
+ begin
16
+ result << JSON.parse(v, symbolize_names: true)
17
+ rescue
18
+ result << v
19
+ end
20
+ end
21
+ result
22
+ end
23
+
24
+ # check params
25
+ #
26
+ # @param mcs [Array] module classes
27
+ # @option mcs [Object] not namespace class name => model class object
28
+ # @param command [String]
29
+ # @param *args [Array]
30
+ # @raise
31
+ def check_params(mcs, command, *args)
32
+ m_class = nil
33
+ mcs.each do |k, v|
34
+ m_class = v if k == command.to_s
35
+ end
36
+ if m_class.nil?
37
+ settings = load_command_setting(command)
38
+ between_param?(settings[:params], args.size)
39
+ else
40
+ between_param?(m_class.params, args.size)
41
+ end
42
+ end
43
+
44
+ def load_command_setting(command)
45
+ fn = self.class.to_s.underscore.split('/').pop
46
+ cm = command.to_sym
47
+ dir = Idcf::Cli::Conf::Const::CMD_FILE_DIR
48
+ ext = Idcf::Cli::Conf::Const::CMD_FILE_EXT
49
+ path = "#{dir}/#{fn}.#{ext}"
50
+ Idcf::Cli::Lib::Util::YmlConf.new(path).find(cm)
51
+ end
52
+
53
+ # between params
54
+ #
55
+ # @param params [Array]
56
+ # @param arg_size [int]
57
+ # @raise
58
+ def between_param?(params, arg_size)
59
+ p_cnt = params.nil? ? 0 : params.size
60
+ return true if method_rest?(params)
61
+ opt_cnt = method_option_cnt(params)
62
+
63
+ min = p_cnt - opt_cnt
64
+ msg = format('Argument: %s', self.class.make_param_s(params))
65
+
66
+ return if arg_size.between?(min, p_cnt)
67
+ raise Idcf::Cli::CliError, msg
68
+ end
69
+
70
+ # is rest
71
+ #
72
+ # @param params [Array]
73
+ # @return Boolean
74
+ def method_rest?(params)
75
+ unless params.nil?
76
+ params.each do |param|
77
+ case param[:arg_type]
78
+ when 'rest'
79
+ return true
80
+ end
81
+ end
82
+ end
83
+ false
84
+ end
85
+
86
+ # option count
87
+ #
88
+ # @param params [Array]
89
+ # @return int
90
+ def method_option_cnt(params)
91
+ result = 0
92
+ unless params.nil?
93
+ params.each do |param|
94
+ case param[:arg_type]
95
+ when 'opt'
96
+ result += 1
97
+ end
98
+ end
99
+ end
100
+ result
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,21 @@
1
+ require_relative './override'
2
+ require_relative './validate'
3
+ require_relative './command'
4
+ require_relative './util'
5
+ require_relative './sdk'
6
+ module Idcf
7
+ module Cli
8
+ module Controller
9
+ module Include
10
+ # init load
11
+ module Init
12
+ include Override
13
+ include Validate
14
+ include Command
15
+ include Util
16
+ include Sdk
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ module Idcf
2
+ module Cli
3
+ module Controller
4
+ module Include
5
+ # override methods
6
+ module Override
7
+ protected
8
+
9
+ # Create a new client
10
+ #
11
+ # @param _o [Hash] other options
12
+ # @return [Response] Mixed
13
+ def make_client(_o)
14
+ raise Idcf::Cli::CliError, 'Required override'
15
+ end
16
+
17
+ # sdk do
18
+ #
19
+ # @param _command [String]
20
+ # @param *_args [Array]
21
+ # @param o [Hash] options
22
+ # @return String
23
+ def do_sdk(_command, *_args, _o)
24
+ raise Idcf::Cli::CliError, 'Requre override'
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,83 @@
1
+ module Idcf
2
+ module Cli
3
+ module Controller
4
+ module Include
5
+ # sdk
6
+ module Sdk
7
+ protected
8
+
9
+ def do_sdk(client, command, *args, _o)
10
+ result = client_send(client, command, *args)
11
+ return result if result.is_a?(Hash)
12
+
13
+ if result.class == Array
14
+ result_arr = []
15
+ result.each do |v|
16
+ result_arr << resource_ext(v)
17
+ end
18
+
19
+ return result_arr
20
+ end
21
+
22
+ resource_ext(result)
23
+ end
24
+
25
+ def client_send(client, command, *args)
26
+ arg = set_headers(client.public_method(command.to_sym), *args.dup)
27
+
28
+ client.__send__(command.to_sym, *arg)
29
+ end
30
+
31
+ def set_headers(method, *args)
32
+ method.parameters.each do |k, v|
33
+ case v[1].to_s
34
+ when 'attributes'
35
+ args[k] = {} unless args[k].class == Hash
36
+ when 'headers'
37
+ args[k] = {} unless args[k].class == Hash
38
+ args[k].merge!(Idcf::Cli::Conf::Const::HEADERS)
39
+ end
40
+ end
41
+ args
42
+ end
43
+
44
+ def resource_ext(val)
45
+ return val unless classes?(val, resource_classes)
46
+ return val.body if classes?(val, responce_classes)
47
+ result = {}
48
+ val.instance_variables.each do |pn_sym|
49
+ pn = pn_sym.to_s
50
+ next if pn == '@client'
51
+ result[pn.gsub(/\A@+/, '')] = val.instance_variable_get(pn)
52
+ end
53
+ result
54
+ end
55
+
56
+ def classes?(val, classes)
57
+ classes.each do |cl|
58
+ return true if val.is_a?(cl)
59
+ end
60
+ false
61
+ end
62
+
63
+ def resource_classes
64
+ []
65
+ end
66
+
67
+ def responce_classes
68
+ []
69
+ end
70
+
71
+ def base_options(o)
72
+ {}.tap do |result|
73
+ sec = get_profile(o)
74
+ [:api_key, :secret_key].each do |v|
75
+ result[v] = o.key?(v) ? o[v] : get_user_conf(v.to_s, sec)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,101 @@
1
+ module Idcf
2
+ module Cli
3
+ module Controller
4
+ module Include
5
+ # util
6
+ module Util
7
+ protected
8
+
9
+ # get user config value
10
+ #
11
+ # @param name [String]
12
+ # @param profile [String]
13
+ # @return String or Hash
14
+ # @raise
15
+ def get_user_conf(name, profile = 'default')
16
+ return @config.find(name, profile) if @config
17
+ @config = make_user_conf
18
+ msg = 'Run the command `configure`'
19
+ raise Idcf::Cli::CliError, msg unless @config
20
+
21
+ @config.find(name, profile)
22
+ end
23
+
24
+ def make_user_conf
25
+ [
26
+ Idcf::Cli::Conf::Const::USER_CONF_PATH,
27
+ Idcf::Cli::Conf::Const::USER_CONF_GLOBAL
28
+ ].each do |v|
29
+ result = Idcf::Cli::Lib::Util::IniConf.new(v)
30
+ return result unless result.load_error?
31
+ end
32
+ nil
33
+ end
34
+
35
+ # get code setting value
36
+ #
37
+ # @param path [String]
38
+ # @return String or Hash
39
+ # @raise
40
+ def get_code_conf(path, o)
41
+ profile = get_profile(o)
42
+
43
+ return get_user_conf(path, profile)
44
+ rescue
45
+ return @code_conf.find(path) if @code_conf
46
+ f_path = Idcf::Cli::Conf::Const::CODE_CONF_PATH
47
+ @code_conf = Idcf::Cli::Lib::Util::YmlConf.new(f_path)
48
+ @code_conf.find(path)
49
+ end
50
+
51
+ # get profile
52
+ #
53
+ # @param o [Hash] options
54
+ # @return String
55
+ def get_profile(o)
56
+ o[:profile] || 'default'
57
+ end
58
+
59
+ # get region
60
+ #
61
+ # @param o [Hash] options
62
+ # @return String
63
+ def get_region(o)
64
+ return o[:region] if o[:region]
65
+ region = get_user_conf('region')
66
+ region.empty? ? 'default' : region
67
+ rescue
68
+ 'default'
69
+ end
70
+
71
+ # make result string
72
+ #
73
+ # @param data [Hash]
74
+ # @param err_f [Boolean]
75
+ # @param o [Hash]
76
+ # @return Stirng
77
+ def make_result_str(data, err_f, o)
78
+ message = data.class == Hash ? data[:message] : {}
79
+ f = output_format(o, message)
80
+ Idcf::Cli::Lib::Convert::Helper.new.format(data, err_f, f)
81
+ end
82
+
83
+ # output format
84
+ #
85
+ # @param o [Hash] options
86
+ # @param message [Hash] Validate Hash
87
+ # @return String
88
+ def output_format(o, message)
89
+ default_output = get_code_conf('output', o)
90
+ if message.class == Hash && !message[:output].nil?
91
+ return default_output
92
+ end
93
+
94
+ f = o[:output]
95
+ f.nil? ? default_output : f
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,79 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+ require 'idcf/cli/conf/const'
4
+
5
+ module Idcf
6
+ module Cli
7
+ module Controller
8
+ module Include
9
+ # validate methods
10
+ module Validate
11
+ protected
12
+
13
+ # validate do
14
+ #
15
+ # @param o [Hahs]
16
+ # @return Hash or nil
17
+ def do_validate(o)
18
+ err = first_validate(o)
19
+ return nil if err.empty?
20
+ make_validation_error(err)
21
+ end
22
+
23
+ # first validate
24
+ #
25
+ # @param o [Hash] options
26
+ # @return Hash or nil
27
+ def first_validate(o)
28
+ validator = make_validate(o, @cmd)
29
+ validator.valid? ? [] : validator.errors.messages
30
+ end
31
+
32
+ # make validate
33
+ #
34
+ # @paeram o [Hash] options
35
+ # @param command [String]
36
+ # @return ActiveModel
37
+ def make_validate(o, command)
38
+ service = self.class.to_s.underscore.split('/').pop
39
+ path = Idcf::Cli::Conf::Const::VALIDATOR_DIR_PATH
40
+ paths = [
41
+ "#{path}/#{service}/#{command}",
42
+ "#{path}/#{service}/base",
43
+ "#{path}/base"
44
+ ]
45
+ load_validate(paths, o)
46
+ end
47
+
48
+ def load_validate(paths, o)
49
+ paths.each do |path|
50
+ begin
51
+ require path
52
+ return path.classify.constantize.new(o)
53
+ rescue LoadError
54
+ next
55
+ end
56
+ end
57
+ raise Idcf::Cli::CliError, 'Validate load error'
58
+ end
59
+
60
+ # make validation error
61
+ #
62
+ # @override
63
+ # @param errors [Hash]
64
+ # @return Hash
65
+ def make_validation_error(errors)
66
+ err = {}
67
+ errors.each do |k, v|
68
+ err[k] = "#{Idcf::Cli::Conf::Const::LOCAL_ERROR_PREFIX}#{v}"
69
+ end
70
+ result = make_base_response
71
+ result[:status] = 400
72
+ result[:message] = err
73
+ result
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,57 @@
1
+ require_relative './base'
2
+ require 'idcf/your'
3
+
4
+ module Idcf
5
+ module Cli
6
+ module Controller
7
+ # Your
8
+ class Your < Base
9
+ default_command :help
10
+
11
+ class << self
12
+ def description
13
+ 'Your Service'
14
+ end
15
+
16
+ def make_blank_client
17
+ Idcf::Your::Client.new(
18
+ api_key: '',
19
+ secret_key: ''
20
+ )
21
+ end
22
+ end
23
+
24
+ protected
25
+
26
+ def make_table_data(data)
27
+ data['data']
28
+ end
29
+
30
+ def resource_classes
31
+ [
32
+ Idcf::Your::Response
33
+ ]
34
+ end
35
+
36
+ def responce_classes
37
+ [
38
+ Idcf::Your::Response
39
+ ]
40
+ end
41
+
42
+ # Create a new client
43
+ # @param o [Hash] other options
44
+ # @return [Response] Idcf::Ilb::Client
45
+ def make_client(o)
46
+ option = {
47
+ host: get_code_conf('your.v1.host', o),
48
+ verify_ssl: o.key?(:no_vssl) ? false : true
49
+ }
50
+ option.merge!(base_options(o))
51
+
52
+ Idcf::Your::Client.new(option)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,11 @@
1
+ module Idcf
2
+ module Cli
3
+ # cli custom error
4
+ class CliError < StandardError
5
+ def message
6
+ msg = super
7
+ "#{Idcf::Cli::Conf::Const::LOCAL_ERROR_PREFIX}#{msg}"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,71 @@
1
+ require 'idcf/cli/conf/const'
2
+ require 'idcf/cli/lib/util/ini_conf'
3
+
4
+ module Idcf
5
+ module Cli
6
+ module Extend
7
+ # configure settings
8
+ module Configure
9
+ protected
10
+
11
+ def do_configure(o)
12
+ path = configure_path(o)
13
+ config = Idcf::Cli::Lib::Util::IniConf.new(path)
14
+ profiles = []
15
+ if o[:profile] != 'default' && !check_profile?(config, 'default')
16
+ profiles << 'default'
17
+ end
18
+ profiles << o[:profile]
19
+ config = configure_input(config, profiles)
20
+ config.write(path)
21
+ end
22
+
23
+ def configure_path(o)
24
+ cls = Idcf::Cli::Conf::Const
25
+ result = o[:global] ? cls::USER_CONF_GLOBAL : cls::USER_CONF_PATH
26
+ File.expand_path(result)
27
+ end
28
+
29
+ def check_profile?(config, name)
30
+ conf = config[name]
31
+ return false if conf.nil?
32
+ Idcf::Cli::Conf::Const::USER_CONF_ITEMS.each do |k, _v|
33
+ return false if conf[k.to_s].strip.empty?
34
+ end
35
+
36
+ true
37
+ end
38
+
39
+ def configure_input(config, profiles)
40
+ profiles.each do |profile|
41
+ dt = config[profile] || {}
42
+ Idcf::Cli::Conf::Const::USER_CONF_ITEMS.each do |k, v|
43
+ nd = dt[k.to_s].nil? ? '' : dt[k.to_s]
44
+ msg = "#{profile}:#{k}[#{nd.empty? ? 'NONE' : nd}] : "
45
+ dt[k.to_s] = configure_qa_dialog(msg, nd, v)
46
+ end
47
+ config[profile] = dt
48
+ end
49
+ config
50
+ end
51
+
52
+ def configure_qa_dialog(msg, nd, setting)
53
+ loop do
54
+ puts msg
55
+ res = STDIN.gets.strip
56
+ next unless !res.empty? || !nd.empty?
57
+ result = res.empty? ? nd : res
58
+ return result if confirmation_at_qa_preference?(result, setting)
59
+ puts "from this [#{setting.join('/')}]"
60
+ end
61
+ end
62
+
63
+ def confirmation_at_qa_preference?(val, setting)
64
+ return true if setting.nil?
65
+ return true if Regexp.new("\\A(#{setting.join('|')})\\Z") =~ val
66
+ false
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,13 @@
1
+ require_relative './update'
2
+ require_relative './configure'
3
+ module Idcf
4
+ module Cli
5
+ module Extend
6
+ # init load
7
+ module Init
8
+ include Update
9
+ include Configure
10
+ end
11
+ end
12
+ end
13
+ end