idcfcloud 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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