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.
- checksums.yaml +7 -0
- data/.codeclimate.yml +21 -0
- data/.gitignore +56 -0
- data/.rubocop.yml +26 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +91 -0
- data/Rakefile +8 -0
- data/bin/idcfcloud +17 -0
- data/config/config_sample.ini +16 -0
- data/exe/idcfcloud +4 -0
- data/idcfcloud.gemspec +43 -0
- data/lib/idcf/cli/conf/conf.yml +10 -0
- data/lib/idcf/cli/conf/const.rb +37 -0
- data/lib/idcf/cli/conf/service/.gitkeep +0 -0
- data/lib/idcf/cli/controller/base.rb +151 -0
- data/lib/idcf/cli/controller/extend/command.rb +48 -0
- data/lib/idcf/cli/controller/extend/init.rb +17 -0
- data/lib/idcf/cli/controller/extend/override.rb +21 -0
- data/lib/idcf/cli/controller/extend/search_module.rb +54 -0
- data/lib/idcf/cli/controller/ilb.rb +62 -0
- data/lib/idcf/cli/controller/include/command.rb +106 -0
- data/lib/idcf/cli/controller/include/init.rb +21 -0
- data/lib/idcf/cli/controller/include/override.rb +30 -0
- data/lib/idcf/cli/controller/include/sdk.rb +83 -0
- data/lib/idcf/cli/controller/include/util.rb +101 -0
- data/lib/idcf/cli/controller/include/validate.rb +79 -0
- data/lib/idcf/cli/controller/your.rb +57 -0
- data/lib/idcf/cli/error/cli_error.rb +11 -0
- data/lib/idcf/cli/extend/configure.rb +71 -0
- data/lib/idcf/cli/extend/init.rb +13 -0
- data/lib/idcf/cli/extend/update.rb +109 -0
- data/lib/idcf/cli/extend/update_file.rb +53 -0
- data/lib/idcf/cli/gem_ext/thor/init_util.rb +92 -0
- data/lib/idcf/cli/index.rb +71 -0
- data/lib/idcf/cli/lib/convert/formatter/base.rb +21 -0
- data/lib/idcf/cli/lib/convert/formatter/csv_format.rb +115 -0
- data/lib/idcf/cli/lib/convert/formatter/json_format.rb +19 -0
- data/lib/idcf/cli/lib/convert/formatter/table_format.rb +19 -0
- data/lib/idcf/cli/lib/convert/formatter/xml_format.rb +21 -0
- data/lib/idcf/cli/lib/convert/helper.rb +28 -0
- data/lib/idcf/cli/lib/util/ini_conf.rb +67 -0
- data/lib/idcf/cli/lib/util/template.rb +29 -0
- data/lib/idcf/cli/lib/util/yml_conf.rb +37 -0
- data/lib/idcf/cli/service/base.rb +56 -0
- data/lib/idcf/cli/service/ilb/add_server_for_protocol.rb +20 -0
- data/lib/idcf/cli/service/ilb/base_server_for_protocol.rb +111 -0
- data/lib/idcf/cli/service/ilb/delete_server_for_protocol.rb +29 -0
- data/lib/idcf/cli/templates/bash/complement.erb +37 -0
- data/lib/idcf/cli/templates/zsh/complement.erb +46 -0
- data/lib/idcf/cli/validate/custom/init.rb +14 -0
- data/lib/idcf/cli/validate/custom/month_check_validator.rb +39 -0
- data/lib/idcf/cli/validate/custom/require_relation_validator.rb +50 -0
- data/lib/idcf/cli/validate/define/base.rb +36 -0
- data/lib/idcf/cli/validate/define/ilb/base.rb +27 -0
- data/lib/idcf/cli/version.rb +5 -0
- metadata +317 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
module Idcf
|
2
|
+
module Cli
|
3
|
+
module Service
|
4
|
+
# model base
|
5
|
+
class Base
|
6
|
+
ARG_TYPE_REQ = :req
|
7
|
+
ARG_TYPE_OPT = :opt
|
8
|
+
ARG_TYPE_REST = :rest
|
9
|
+
ARG_TYPE_BLOCK = :block
|
10
|
+
class << self
|
11
|
+
attr_reader :options, :params
|
12
|
+
# option
|
13
|
+
#
|
14
|
+
# @param name [String]
|
15
|
+
# @param attr [Hash]
|
16
|
+
# @option attr [String] :type
|
17
|
+
# @option attr [Boolean] :required
|
18
|
+
# @option attr [String] :desc
|
19
|
+
def option(name, *attr)
|
20
|
+
@options ||= {}
|
21
|
+
@options[name] = attr
|
22
|
+
end
|
23
|
+
|
24
|
+
# params
|
25
|
+
#
|
26
|
+
# @param values [String]
|
27
|
+
# @param arg_type [String]
|
28
|
+
def param(name, arg_type = ARG_TYPE_REQ)
|
29
|
+
@params ||= []
|
30
|
+
s = @params.select do |v|
|
31
|
+
v[:name] == name
|
32
|
+
end
|
33
|
+
|
34
|
+
param = {
|
35
|
+
name: name,
|
36
|
+
arg_type: arg_type
|
37
|
+
}
|
38
|
+
|
39
|
+
@params << param if s.size.zero?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# do
|
44
|
+
#
|
45
|
+
# @param _client [Mixed]
|
46
|
+
# @param *_args [Array]
|
47
|
+
# @param _o [Hash] options
|
48
|
+
# @return Hash
|
49
|
+
# @raise
|
50
|
+
def do(_client, *_args, _o)
|
51
|
+
raise Idcf::Cli::CliError, 'Require override'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative './base_server_for_protocol'
|
2
|
+
|
3
|
+
module Idcf
|
4
|
+
module Cli
|
5
|
+
module Service
|
6
|
+
module Ilb
|
7
|
+
# add server
|
8
|
+
class AddServerForProtocol < BaseServerForProtocol
|
9
|
+
init
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def do_command(lb_id, config, target)
|
14
|
+
client.add_server(lb_id, config['id'], target)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require_relative '../base'
|
2
|
+
|
3
|
+
module Idcf
|
4
|
+
module Cli
|
5
|
+
module Service
|
6
|
+
module Ilb
|
7
|
+
# [add/delete] server for protocol
|
8
|
+
class BaseServerForProtocol < Idcf::Cli::Service::Base
|
9
|
+
class << self
|
10
|
+
def init
|
11
|
+
param :lb_id
|
12
|
+
param :protocol
|
13
|
+
param :protocol_port
|
14
|
+
param :data, Base::ARG_TYPE_REQ
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :client
|
19
|
+
|
20
|
+
# do
|
21
|
+
#
|
22
|
+
# @param client [Idcf::Ilb::Client]
|
23
|
+
# @param args [Array]
|
24
|
+
# @option args [String] lb id
|
25
|
+
# @option args [Stirng] configure protocol
|
26
|
+
# @option args [int] configure port
|
27
|
+
# @option args [Hash] server info {ipaddress: '0.0.0.0', port: 80}
|
28
|
+
# @param o [Hash] options
|
29
|
+
def do(client, *args, o)
|
30
|
+
@client = client
|
31
|
+
lb_id = args[0]
|
32
|
+
lb = search_lb(lbs, lb_id)
|
33
|
+
config = search_config(lb, args[1], args[2])
|
34
|
+
|
35
|
+
if config.nil?
|
36
|
+
not_param = o[:protocol].nil? ? 'conf_id' : 'protocol'
|
37
|
+
raise Idcf::Cli::CliError, "Target not found (#{not_param})"
|
38
|
+
end
|
39
|
+
|
40
|
+
do_command(lb_id, config, args[3])
|
41
|
+
client.list_servers(lb_id, config['id'])
|
42
|
+
end
|
43
|
+
|
44
|
+
protected
|
45
|
+
|
46
|
+
def do_command(_lb_id, _config, _target)
|
47
|
+
raise Idcf::Cli::CliError, 'override required'
|
48
|
+
end
|
49
|
+
|
50
|
+
# get lb list [Idcf::Ilb::Client]
|
51
|
+
#
|
52
|
+
# @param client
|
53
|
+
# @return Array in Hash
|
54
|
+
# @raise
|
55
|
+
def lbs
|
56
|
+
lb = client.get(:loadbalancers)
|
57
|
+
msg = "Status: #{lb.status}"
|
58
|
+
raise Idcf::Cli::CliError, msg if !lb.success? || lb.status != 200
|
59
|
+
|
60
|
+
lb.body
|
61
|
+
end
|
62
|
+
|
63
|
+
# search lb target
|
64
|
+
#
|
65
|
+
# @param list
|
66
|
+
# @param id
|
67
|
+
# @return [Hash]
|
68
|
+
# @raise
|
69
|
+
def search_lb(list, id)
|
70
|
+
lbs = list.select do |v|
|
71
|
+
v['id'] == id
|
72
|
+
end
|
73
|
+
|
74
|
+
msg = "Target lb_id not found ( #{id} )"
|
75
|
+
raise Idcf::Cli::CliError, msg if lbs.empty?
|
76
|
+
|
77
|
+
lbs[0]
|
78
|
+
end
|
79
|
+
|
80
|
+
# config search
|
81
|
+
#
|
82
|
+
# @param lb_info [Hash]
|
83
|
+
# @param o [Hash]
|
84
|
+
# @return Hash
|
85
|
+
# @raise
|
86
|
+
def search_config(lb_info, protocol, p_port)
|
87
|
+
lb_info['configs'].each do |v|
|
88
|
+
next unless target_config?(v, protocol, p_port)
|
89
|
+
unless v['state'].casecmp('running').zero?
|
90
|
+
msg = 'The operation is impossible because the target is currently being processed'
|
91
|
+
raise Idcf::Cli::CliError, msg
|
92
|
+
end
|
93
|
+
return v
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# is target config
|
98
|
+
#
|
99
|
+
# @param config [Hash]
|
100
|
+
# @param protocol [String]
|
101
|
+
# @param p_port [String]
|
102
|
+
# @return boolean
|
103
|
+
def target_config?(config, purotocol, p_port)
|
104
|
+
config['frontend_protocol'] == purotocol &&
|
105
|
+
config['port'].to_s == p_port.to_s
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative './base_server_for_protocol'
|
2
|
+
|
3
|
+
module Idcf
|
4
|
+
module Cli
|
5
|
+
module Service
|
6
|
+
module Ilb
|
7
|
+
# delete server
|
8
|
+
class DeleteServerForProtocol < BaseServerForProtocol
|
9
|
+
init
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def do_command(lb_id, config, target)
|
14
|
+
server_id = search_server_id(config['servers'], target)
|
15
|
+
client.delete_server(lb_id, config['id'], server_id)
|
16
|
+
end
|
17
|
+
|
18
|
+
def search_server_id(servers, target)
|
19
|
+
result = servers.select do |v|
|
20
|
+
v['ipaddress'] == target[:ipaddress] &&
|
21
|
+
v['port'] == target[:port]
|
22
|
+
end
|
23
|
+
result.first['id'] if result.size == 1
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
#set -eu
|
3
|
+
|
4
|
+
_idcfcloud()
|
5
|
+
{
|
6
|
+
<% @variables.each do |k, v| %>local <%= k %>="<%= v.join(' ') %>"
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
local cur=${COMP_WORDS[COMP_CWORD]}
|
10
|
+
local list=""
|
11
|
+
local names=()
|
12
|
+
local index=$(( $COMP_CWORD - 1 ))
|
13
|
+
local val_name=""
|
14
|
+
|
15
|
+
if [ $COMP_CWORD = 1 ]; then
|
16
|
+
list=$top
|
17
|
+
else
|
18
|
+
for (( i=1; i <= $index; i++)); do
|
19
|
+
names+=( ${COMP_WORDS[i]} )
|
20
|
+
done
|
21
|
+
|
22
|
+
val_name="$(IFS=_; echo "${names[*]}")"
|
23
|
+
if [ ${COMP_WORDS[index]} = "help" ]; then
|
24
|
+
names=(${names[@]:0:((${#names[@]}-1))})
|
25
|
+
val_name="$(IFS=_; echo "${names[*]}")"
|
26
|
+
fi
|
27
|
+
|
28
|
+
if [ "${val_name}" = "" ]; then
|
29
|
+
val_name="top"
|
30
|
+
fi
|
31
|
+
list=${!val_name:-}
|
32
|
+
fi
|
33
|
+
|
34
|
+
COMPREPLY=( $(compgen -W "$list" -- $cur) )
|
35
|
+
}
|
36
|
+
|
37
|
+
complete -F _idcfcloud idcfcloud
|
@@ -0,0 +1,46 @@
|
|
1
|
+
_idcfcloud()
|
2
|
+
{
|
3
|
+
_arguments -C \
|
4
|
+
'1: :__idcfcloud_services' \
|
5
|
+
'*: :__idcfcloud_commands' \
|
6
|
+
&& ret=0
|
7
|
+
}
|
8
|
+
|
9
|
+
__idcfcloud_services()
|
10
|
+
{
|
11
|
+
local -a _c
|
12
|
+
_c=(<% @variables['top'].each do |v| %>"<%= v %>" <% end %>)
|
13
|
+
|
14
|
+
_describe -t commands Commands _c
|
15
|
+
}
|
16
|
+
|
17
|
+
__idcfcloud_commands()
|
18
|
+
{
|
19
|
+
local -a _c
|
20
|
+
|
21
|
+
local names=()
|
22
|
+
for (( i=2; i < $CURRENT; i++)); do
|
23
|
+
names+=( ${words[i]} )
|
24
|
+
done
|
25
|
+
local val_name="$(IFS=_; echo "${names[*]}")"
|
26
|
+
if [ ${words[$CURRENT - 1]} = "help" ]; then
|
27
|
+
names=${names[1, -2]}
|
28
|
+
val_name="$(IFS=_; echo "${names[*]}")"
|
29
|
+
fi
|
30
|
+
|
31
|
+
case $val_name in<%
|
32
|
+
@variables.each do |k, v|
|
33
|
+
next if k == 'top'
|
34
|
+
%>
|
35
|
+
(<%= k %>)
|
36
|
+
_c=(<% v.each do |command| %>"<%= command %>" <% end %>)
|
37
|
+
;;<% end %>
|
38
|
+
("")
|
39
|
+
_c=(<% @variables['top'].each do |v| %>"<%= v %>" <% end %>)
|
40
|
+
;;
|
41
|
+
esac
|
42
|
+
|
43
|
+
_describe -t commands Commands _c
|
44
|
+
}
|
45
|
+
|
46
|
+
compdef _idcfcloud idcfcloud
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Idcf
|
2
|
+
module Cli
|
3
|
+
module Validate
|
4
|
+
# custom validation load sesettings
|
5
|
+
module Custom
|
6
|
+
path = 'idcf/cli/validate/custom/'
|
7
|
+
autoload :RequireRelationValidator,
|
8
|
+
"#{path}require_relation_validator"
|
9
|
+
autoload :MonthCheckValidator,
|
10
|
+
"#{path}month_check_validator"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'idcf/cli/lib/util/option'
|
3
|
+
require 'ipaddr'
|
4
|
+
|
5
|
+
module Idcf
|
6
|
+
module Cli
|
7
|
+
module Validate
|
8
|
+
module Custom
|
9
|
+
# target validator
|
10
|
+
class MonthCheckValidator < ActiveModel::EachValidator
|
11
|
+
MESSAGES = {
|
12
|
+
format: 'different format ex)YYYY-MM',
|
13
|
+
invalid: 'An invalid date'
|
14
|
+
}.freeze
|
15
|
+
|
16
|
+
def validate_each(record, attr, val)
|
17
|
+
str = MESSAGES[:format]
|
18
|
+
return record.errors.add(attr, str, {}) unless format?(val)
|
19
|
+
str = MESSAGES[:invalid]
|
20
|
+
return record.errors.add(attr, str, {}) unless valid?(val)
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def format?(val)
|
26
|
+
!(val =~ /\A\d{4}-\d{1,2}\Z/).nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
def valid?(val)
|
30
|
+
Date.parse("#{val}-01")
|
31
|
+
true
|
32
|
+
rescue
|
33
|
+
false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
|
3
|
+
module Idcf
|
4
|
+
module Cli
|
5
|
+
module Validate
|
6
|
+
module Custom
|
7
|
+
# require relation validator
|
8
|
+
class RequireRelationValidator < ActiveModel::EachValidator
|
9
|
+
MESSAGES = {
|
10
|
+
message: 'A related parameter isn\'t input. (%s)'
|
11
|
+
}.freeze
|
12
|
+
|
13
|
+
def validate(record)
|
14
|
+
return unless process?(record)
|
15
|
+
|
16
|
+
nones = make_nones(record)
|
17
|
+
return if nones.empty?
|
18
|
+
|
19
|
+
msg = MESSAGES[:message] % nones.join('/')
|
20
|
+
record.errors.add(nones.first, msg, {})
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def process?(record)
|
26
|
+
list = []
|
27
|
+
op = options
|
28
|
+
attributes.each do |attr|
|
29
|
+
value = record.read_attribute_for_validation(attr)
|
30
|
+
next if value.blank? && (op[:allow_nil] || op[:allow_blank])
|
31
|
+
list << attr
|
32
|
+
end
|
33
|
+
|
34
|
+
list.present?
|
35
|
+
end
|
36
|
+
|
37
|
+
def make_nones(record)
|
38
|
+
result = []
|
39
|
+
attributes.each do |attr|
|
40
|
+
value = record.read_attribute_for_validation(attr)
|
41
|
+
result << attr if value.blank? || value == attr.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
result
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'active_model/model'
|
3
|
+
module Idcf
|
4
|
+
module Cli
|
5
|
+
module Validate
|
6
|
+
module Define
|
7
|
+
# Base Validate
|
8
|
+
class Base
|
9
|
+
include ActiveModel::Model
|
10
|
+
include Idcf::Cli::Validate::Custom
|
11
|
+
|
12
|
+
attr_accessor :output,
|
13
|
+
:profile,
|
14
|
+
:api_key,
|
15
|
+
:secret_key,
|
16
|
+
:no_ssl,
|
17
|
+
:no_vssl
|
18
|
+
|
19
|
+
validates :output,
|
20
|
+
allow_blank: true,
|
21
|
+
inclusion: {
|
22
|
+
in: %w(table json xml csv),
|
23
|
+
message: 'from this [table/json/xml/csv]'
|
24
|
+
}
|
25
|
+
|
26
|
+
validates :api_key,
|
27
|
+
:secret_key,
|
28
|
+
allow_blank: true,
|
29
|
+
require_relation: {
|
30
|
+
in: true
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'active_model/model'
|
3
|
+
require_relative '../base'
|
4
|
+
module Idcf
|
5
|
+
module Cli
|
6
|
+
module Validate
|
7
|
+
module Define
|
8
|
+
module Ilb
|
9
|
+
# Base Validate
|
10
|
+
class Base < Idcf::Cli::Validate::Define::Base
|
11
|
+
include ActiveModel::Model
|
12
|
+
include Idcf::Cli::Validate::Custom
|
13
|
+
|
14
|
+
attr_accessor :region
|
15
|
+
|
16
|
+
validates :region,
|
17
|
+
allow_blank: true,
|
18
|
+
inclusion: {
|
19
|
+
in: Idcf::Cli::Conf::Const::REGIONS,
|
20
|
+
message: "from this [#{Idcf::Cli::Conf::Const::REGIONS.join('/')}]"
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|