diff --git a/.gitignore b/.gitignore index e7997a6cd..880d45482 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,9 @@ vendor/bower_components /frontend/node_modules/ /frontend/typings/ +# MAC system files +.DS_Store +.idea/ #emacs backup exclude during commit (clean files) diff --git a/.rubocop.yml b/.rubocop.yml index a71be35db..ba349d6a8 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -99,7 +99,7 @@ Style/ConstantName: Style/DefWithParentheses: Enabled: false -Style/DeprecatedHashMethods: +Style/PreferredHashMethods: Enabled: false Style/Documentation: @@ -219,7 +219,7 @@ Style/LeadingCommentSpace: Style/LineEndConcatenation: Enabled: false -Style/MethodCallParentheses: +Style/MethodCallWithoutArgsParentheses: Enabled: false Style/MethodDefParentheses: diff --git a/.travis.yml b/.travis.yml index e3df86b49..d3c4250ac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,3 +23,6 @@ before_script: script: - bundle exec rspec + +notifications: + slack: skyarch:RrGXgQVUmTe0r565gbHYMnmQ diff --git a/Gemfile b/Gemfile index 1b96f4638..bbb962ea1 100644 --- a/Gemfile +++ b/Gemfile @@ -48,7 +48,8 @@ gem "font-awesome-rails" gem 'aws-sdk-v1' gem 'aws-sdk', '~> 2' -gem 'ridley', '~> 4.2.0' +gem 'awspec', require: false +gem 'ridley', '~> 5' gem "net-ssh" gem "net-scp" gem "net-http-persistent", '~> 2.9.4' @@ -63,6 +64,7 @@ gem "sidekiq-cron", "~> 0.4.0" # for Scheduled Job gem 'foreman', require: false gem "introjs-rails" +gem 'turnout' # for maintenance mode # Temporarily set ruby_dep version to 1.3.1 because it requires ruby 2.2.5 that is not yet available on amazon linux gem "ruby_dep", "~> 1.3.1" @@ -84,7 +86,10 @@ group :development, :test do # test gem "rspec-rails" - gem "factory_girl_rails" + + # Test seems to be failing because of this issue: + # https://github.com/thoughtbot/factory_girl/issues/981 + gem "factory_girl_rails", "~> 4.7.0" gem "database_cleaner" gem 'guard-rspec' gem 'coveralls', require: false @@ -130,8 +135,8 @@ gem 'rqrcode' gem 'sky_zabbix', '~> 2.2.0' -gem 'nokogiri', '>= 1.6.8' +gem 'nokogiri', '>= 1.7.1' gem 'rails-html-sanitizer', '~> 1.0.3' -gem 'rubyzip' +gem 'rubyzip', '>= 1.2.1' diff --git a/Gemfile.lock b/Gemfile.lock index 1ffe8a1bb..522649e3a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -30,7 +30,7 @@ GEM activemodel (= 4.2.7.1) activesupport (= 4.2.7.1) arel (~> 6.0) - activerecord-import (0.16.2) + activerecord-import (0.19.0) activerecord (>= 3.2) activesupport (4.2.7.1) i18n (~> 0.7) @@ -38,26 +38,38 @@ GEM minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) - addressable (2.5.0) + addressable (2.5.1) public_suffix (~> 2.0, >= 2.0.2) - arel (6.0.3) + arel (6.0.4) ast (2.3.0) - autodoc (0.6.0) + autodoc (0.6.1) actionpack activesupport (>= 3.0.0) rspec - awesome_print (1.7.0) - aws-sdk (2.6.35) - aws-sdk-resources (= 2.6.35) - aws-sdk-core (2.6.35) + awesome_print (1.8.0) + aws-sdk (2.9.44) + aws-sdk-resources (= 2.9.44) + aws-sdk-core (2.9.44) aws-sigv4 (~> 1.0) jmespath (~> 1.0) - aws-sdk-resources (2.6.35) - aws-sdk-core (= 2.6.35) - aws-sdk-v1 (1.66.0) + aws-sdk-resources (2.9.44) + aws-sdk-core (= 2.9.44) + aws-sdk-v1 (1.67.0) json (~> 1.4) - nokogiri (>= 1.4.4) + nokogiri (~> 1) aws-sigv4 (1.0.0) + aws_config (0.1.0) + awsecrets (1.11.0) + aws-sdk (~> 2) + aws_config (~> 0.1.0) + awspec (0.81.1) + activesupport (~> 4.0) + aws-sdk (>= 2.2, < 2.10) + awsecrets (~> 1.11) + rspec (~> 3.0) + rspec-its + term-ansicolor + thor bcrypt (3.1.11) better_errors (2.1.1) coderay (>= 1.0.0) @@ -65,20 +77,20 @@ GEM rack (>= 0.9.0) binding_of_caller (0.7.2) debug_inspector (>= 0.0.1) - browserify-rails (3.4.0) + browserify-rails (4.2.0) addressable (>= 2.4.0) - railties (>= 4.0.0, < 5.1) - sprockets (>= 3.5.2) - buff-config (1.0.1) - buff-extensions (~> 1.0) - varia_model (~> 0.4) - buff-extensions (1.0.0) + railties (>= 4.0.0, < 5.2) + sprockets (>= 3.6.0) + buff-config (2.0.0) + buff-extensions (~> 2.0) + varia_model (~> 0.6) + buff-extensions (2.0.0) buff-ignore (1.2.0) - buff-ruby_engine (0.1.0) - buff-shell_out (0.2.0) - buff-ruby_engine (~> 0.1.0) - builder (3.2.2) - bullet (5.4.2) + buff-ruby_engine (1.0.0) + buff-shell_out (1.1.0) + buff-ruby_engine (~> 1.0) + builder (3.2.3) + bullet (5.5.1) activesupport (>= 3.0.0) uniform_notifier (~> 1.10.0) celluloid (0.16.0) @@ -86,25 +98,25 @@ GEM celluloid-io (0.16.2) celluloid (>= 0.16.0) nio4r (>= 1.1.0) - chef (12.16.42) + chef (12.21.1) addressable bundler (>= 1.10) - chef-config (= 12.16.42) - chef-zero (>= 4.8) + chef-config (= 12.21.1) + chef-zero (>= 4.8, < 13) diff-lcs (~> 1.2, >= 1.2.4) erubis (~> 2.7) ffi-yajl (~> 2.2) highline (~> 1.6, >= 1.6.9) iniparse (~> 1.4) - mixlib-archive (>= 0.2.0) + mixlib-archive (~> 0.4) mixlib-authentication (~> 1.4) mixlib-cli (~> 1.7) mixlib-log (~> 1.3) mixlib-shellout (~> 2.0) net-sftp (~> 2.1, >= 2.1.2) - net-ssh (>= 2.9, < 4.0) - net-ssh-multi (~> 1.1) - ohai (>= 8.6.0.alpha.1, < 9) + net-ssh (>= 2.9, < 5.0) + net-ssh-multi (~> 1.2, >= 1.2.1) + ohai (>= 8.6.0.alpha.1, < 13) plist (~> 3.2) proxifier (~> 1.0) rspec-core (~> 3.5) @@ -115,7 +127,7 @@ GEM specinfra (~> 2.10) syslog-logger (~> 1.6) uuidtools (~> 2.1.5) - chef-config (12.16.42) + chef-config (12.21.1) addressable fuzzyurl mixlib-config (~> 2.0) @@ -128,23 +140,23 @@ GEM uuidtools (~> 2.1) chunky_png (1.3.8) coderay (1.1.1) - coffee-rails (4.2.1) + coffee-rails (4.2.2) coffee-script (>= 2.2.0) - railties (>= 4.0.0, < 5.2.x) + railties (>= 4.0.0) coffee-script (2.4.1) coffee-script-source execjs - coffee-script-source (1.11.1) - concurrent-ruby (1.0.2) + coffee-script-source (1.12.2) + concurrent-ruby (1.0.5) connection_pool (2.2.1) - coveralls (0.8.17) + coveralls (0.8.21) json (>= 1.8, < 3) - simplecov (~> 0.12.0) + simplecov (~> 0.14.1) term-ansicolor (~> 1.3) - thor (~> 0.19.1) + thor (~> 0.19.4) tins (~> 1.6) - database_cleaner (1.5.3) - debug_inspector (0.0.2) + database_cleaner (1.6.1) + debug_inspector (0.0.3) devise (3.5.10) bcrypt (~> 3.0) orm_adapter (~> 0.1) @@ -152,34 +164,36 @@ GEM responders thread_safe (~> 0.1) warden (~> 1.2.3) - devise-i18n (1.1.1) - diff-lcs (1.2.5) + devise-i18n (1.1.2) + diff-lcs (1.3) docile (1.1.5) erubis (2.7.0) + et-orbi (1.0.4) + tzinfo execjs (2.7.0) factory_girl (4.7.0) activesupport (>= 3.0.0) factory_girl_rails (4.7.0) factory_girl (~> 4.7.0) railties (>= 3.0.0) - faraday (0.9.2) + faraday (0.12.1) multipart-post (>= 1.2, < 3) - ffi (1.9.14) + ffi (1.9.18) ffi-yajl (2.3.0) libyajl2 (~> 1.2) - font-awesome-rails (4.7.0.0) - railties (>= 3.2, < 5.1) - foreman (0.82.0) + font-awesome-rails (4.7.0.2) + railties (>= 3.2, < 5.2) + foreman (0.84.0) thor (~> 0.19.1) formatador (0.2.5) fuzzyurl (0.9.0) git-version-bump (0.15.1) - github-markup (1.4.0) - globalid (0.3.7) - activesupport (>= 4.1.0) + github-markup (1.6.0) + globalid (0.4.0) + activesupport (>= 4.2.0) gssapi (1.2.0) ffi (>= 1.0.1) - guard (2.14.0) + guard (2.14.1) formatador (>= 0.2.4) listen (>= 2.7, < 4.0) lumberjack (~> 1.0) @@ -195,32 +209,41 @@ GEM rspec (>= 2.99.0, < 4.0) gyoku (1.3.1) builder (>= 2.1.2) - hashie (2.1.2) + hashie (3.5.5) highline (1.7.8) hiredis (0.6.1) - hitimes (1.2.4) + hitimes (1.2.5) httpclient (2.8.3) i18n (0.7.0) - i18n-js (2.1.2) - i18n - iniparse (1.4.2) + i18n-js (3.0.0) + i18n (~> 0.6, >= 0.6.6) + iniparse (1.4.3) introjs-rails (1.0.0) sass-rails (>= 3.2) thor (~> 0.14) ipaddress (0.8.3) - jbuilder (2.6.1) - activesupport (>= 3.0.0, < 5.1) - multi_json (~> 1.2) + jbuilder (2.7.0) + activesupport (>= 4.2.0) + multi_json (>= 1.2) jmespath (1.3.1) - json (1.8.3) - kaminari (0.17.0) - actionpack (>= 3.0.0) - activesupport (>= 3.0.0) - kgio (2.10.0) - knife-windows (1.7.1) + json (1.8.6) + kaminari (1.0.1) + activesupport (>= 4.1.0) + kaminari-actionview (= 1.0.1) + kaminari-activerecord (= 1.0.1) + kaminari-core (= 1.0.1) + kaminari-actionview (1.0.1) + actionview + kaminari-core (= 1.0.1) + kaminari-activerecord (1.0.1) + activerecord + kaminari-core (= 1.0.1) + kaminari-core (1.0.1) + kgio (2.11.0) + knife-windows (1.9.0) winrm (~> 2.1) winrm-elevated (~> 1.0) - libv8 (3.16.14.17) + libv8 (3.16.14.19) libyajl2 (1.2.0) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) @@ -232,16 +255,16 @@ GEM multi_json (>= 1.3.6) loofah (2.0.3) nokogiri (>= 1.5.9) - lumberjack (1.0.10) - mail (2.6.4) + lumberjack (1.0.12) + mail (2.6.6) mime-types (>= 1.16, < 4) method_source (0.8.2) mime-types (3.1) mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) - mini_portile2 (2.1.0) - minitest (5.10.1) - mixlib-archive (0.2.0) + mini_portile2 (2.2.0) + minitest (5.10.2) + mixlib-archive (0.4.1) mixlib-log mixlib-authentication (1.4.1) mixlib-log @@ -260,22 +283,22 @@ GEM net-ssh (>= 2.6.5) net-sftp (2.1.2) net-ssh (>= 2.6.5) - net-ssh (3.2.0) - net-ssh-gateway (1.2.0) - net-ssh (>= 2.6.5) + net-ssh (4.1.0) + net-ssh-gateway (2.0.0) + net-ssh (>= 4.0.0) net-ssh-multi (1.2.1) net-ssh (>= 2.6.5) net-ssh-gateway (>= 1.2.0) net-telnet (0.1.1) - nio4r (1.2.1) - nokogiri (1.6.8.1) - mini_portile2 (~> 2.1.0) + nio4r (2.1.0) + nokogiri (1.8.0) + mini_portile2 (~> 2.2.0) nori (2.6.0) notiffany (0.1.1) nenv (~> 0.1) shellany (~> 0.0) - ohai (8.22.1) - chef-config (>= 12.5.0.alpha.1, < 13) + ohai (8.24.0) + chef-config (>= 12.5.0.alpha.1, < 14) ffi (~> 1.9) ffi-yajl (~> 2.2) ipaddress @@ -287,27 +310,30 @@ GEM systemu (~> 2.6.4) wmi-lite (~> 1.0) orm_adapter (0.5.0) - parser (2.3.3.1) + parallel (1.11.2) + parser (2.4.0.0) ast (~> 2.2) - plist (3.2.0) + plist (3.3.0) powerpack (0.1.1) proxifier (1.0.3) pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) slop (~> 3.4) - pry-doc (0.9.0) + pry-doc (0.10.0) pry (~> 0.9) - yard (~> 0.8) - pry-rails (0.3.4) - pry (>= 0.9.10) + yard (~> 0.9) + pry-rails (0.3.6) + pry (>= 0.10.4) pry-remote (0.1.8) pry (~> 0.9) slop (~> 3.0) - public_suffix (2.0.4) + public_suffix (2.0.5) pundit (1.1.0) activesupport (>= 3.0.0) - rack (1.6.5) + rack (1.6.8) + rack-accept (0.4.5) + rack (>= 0.4) rack-contrib (1.4.0) git-version-bump (~> 0.15) rack (~> 1.4) @@ -315,7 +341,7 @@ GEM rack rack-test (0.6.3) rack (>= 1.0) - railroady (1.5.2) + railroady (1.5.3) rails (4.2.7.1) actionmailer (= 4.2.7.1) actionpack (= 4.2.7.1) @@ -329,9 +355,9 @@ GEM sprockets-rails rails-deprecated_sanitizer (1.0.3) activesupport (>= 4.2.0.alpha) - rails-dom-testing (1.0.7) + rails-dom-testing (1.0.8) activesupport (>= 4.2.0.beta, < 5.0) - nokogiri (~> 1.6.0) + nokogiri (~> 1.6) rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) @@ -343,86 +369,90 @@ GEM activesupport (= 4.2.7.1) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - rainbow (2.1.0) - raindrops (0.17.0) + rainbow (2.2.2) + rake + raindrops (0.18.0) rake (12.0.0) rb-fsevent (0.9.8) - rb-inotify (0.9.7) - ffi (>= 0.5.0) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) rdoc (4.3.0) - redcarpet (3.3.4) - redis (3.3.2) + redcarpet (3.4.0) + redis (3.3.3) redis-actionpack (5.0.1) actionpack (>= 4.0, < 6) redis-rack (>= 1, < 3) redis-store (>= 1.1.0, < 1.4.0) - redis-activesupport (5.0.1) + redis-activesupport (5.0.2) activesupport (>= 3, < 6) - redis-store (~> 1.2.0) - redis-namespace (1.5.2) + redis-store (~> 1.3.0) + redis-namespace (1.5.3) redis (~> 3.0, >= 3.0.4) - redis-rack (1.6.0) - rack (~> 1.5) - redis-store (~> 1.2.0) - redis-rails (5.0.1) - redis-actionpack (~> 5.0.0) - redis-activesupport (~> 5.0.0) - redis-store (~> 1.2.0) - redis-store (1.2.0) + redis-rack (2.0.2) + rack (>= 1.5, < 3) + redis-store (>= 1.2, < 1.4) + redis-rails (5.0.2) + redis-actionpack (>= 5.0, < 6) + redis-activesupport (>= 5.0, < 6) + redis-store (>= 1.2, < 2) + redis-store (1.3.0) redis (>= 2.2) ref (2.0.0) - responders (2.3.0) - railties (>= 4.2.0, < 5.1) + responders (2.4.0) + actionpack (>= 4.2.0, < 5.3) + railties (>= 4.2.0, < 5.3) retryable (2.0.4) - ridley (4.2.0) + ridley (5.1.1) addressable - buff-config (~> 1.0) - buff-extensions (~> 1.0) - buff-ignore (~> 1.1) - buff-shell_out (~> 0.1) + buff-config (~> 2.0) + buff-extensions (~> 2.0) + buff-ignore (~> 1.2) + buff-shell_out (~> 1.0) celluloid (~> 0.16.0) celluloid-io (~> 0.16.1) + chef-config (>= 12.5.0) erubis - faraday (~> 0.9.0) - hashie (>= 2.0.2, < 3.0.0) + faraday (~> 0.9) + hashie (>= 2.0.2, < 4.0.0) + httpclient (~> 2.7) json (>= 1.7.7) mixlib-authentication (>= 1.3.0) - net-http-persistent (>= 2.8) retryable (~> 2.0) - semverse (~> 1.1) - varia_model (~> 0.4) + semverse (~> 2.0) + varia_model (~> 0.6) rotp (3.3.0) rqrcode (0.10.1) chunky_png (~> 1.0) - rspec (3.5.0) - rspec-core (~> 3.5.0) - rspec-expectations (~> 3.5.0) - rspec-mocks (~> 3.5.0) - rspec-core (3.5.4) - rspec-support (~> 3.5.0) - rspec-expectations (3.5.0) + rspec (3.6.0) + rspec-core (~> 3.6.0) + rspec-expectations (~> 3.6.0) + rspec-mocks (~> 3.6.0) + rspec-core (3.6.0) + rspec-support (~> 3.6.0) + rspec-expectations (3.6.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.5.0) + rspec-support (~> 3.6.0) rspec-its (1.2.0) rspec-core (>= 3.0.0) rspec-expectations (>= 3.0.0) - rspec-mocks (3.5.0) + rspec-mocks (3.6.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.5.0) - rspec-rails (3.5.2) + rspec-support (~> 3.6.0) + rspec-rails (3.6.0) actionpack (>= 3.0) activesupport (>= 3.0) railties (>= 3.0) - rspec-core (~> 3.5.0) - rspec-expectations (~> 3.5.0) - rspec-mocks (~> 3.5.0) - rspec-support (~> 3.5.0) - rspec-support (3.5.0) + rspec-core (~> 3.6.0) + rspec-expectations (~> 3.6.0) + rspec-mocks (~> 3.6.0) + rspec-support (~> 3.6.0) + rspec-support (3.6.0) rspec_junit_formatter (0.2.3) builder (< 4) rspec-core (>= 2, < 4, != 2.12.0) - rubocop (0.46.0) - parser (>= 2.3.1.1, < 3.0) + rubocop (0.49.1) + parallel (~> 1.10) + parser (>= 2.3.3.1, < 3.0) powerpack (~> 0.1) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.7) @@ -430,11 +460,11 @@ GEM ruby-prof (0.16.2) ruby-progressbar (1.8.1) ruby_dep (1.3.1) - rubyntlm (0.6.1) - rubyzip (1.2.0) - rufus-scheduler (3.3.1) - tzinfo - sass (3.4.22) + rubyntlm (0.6.2) + rubyzip (1.2.1) + rufus-scheduler (3.4.2) + et-orbi (~> 1.0) + sass (3.4.24) sass-rails (5.0.6) railties (>= 4.0.0, < 6) sass (~> 3.1) @@ -444,75 +474,80 @@ GEM sdoc (0.4.2) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) - semverse (1.2.1) - serverspec (2.37.2) + semverse (2.0.0) + serverspec (2.39.1) multi_json rspec (~> 3.0) rspec-its - specinfra (~> 2.53) + specinfra (~> 2.68) sfl (2.3) shellany (0.0.1) - sidekiq (4.2.7) + sidekiq (5.0.3) concurrent-ruby (~> 1.0) connection_pool (~> 2.2, >= 2.2.0) rack-protection (>= 1.5.0) - redis (~> 3.2, >= 3.2.1) + redis (~> 3.3, >= 3.3.3) sidekiq-cron (0.4.5) redis-namespace (>= 1.5.2) rufus-scheduler (>= 2.0.24) sidekiq (>= 4.2.1) - simplecov (0.12.0) + simplecov (0.14.1) docile (~> 1.1.0) json (>= 1.8, < 3) simplecov-html (~> 0.10.0) - simplecov-html (0.10.0) - sinatra (1.4.7) + simplecov-html (0.10.1) + sinatra (1.4.8) rack (~> 1.5) rack-protection (~> 1.4) tilt (>= 1.3, < 3) sky_zabbix (2.2.0.1.2) slop (3.6.0) - specinfra (2.66.2) + specinfra (2.68.0) net-scp - net-ssh (>= 2.7, < 4.0) + net-ssh (>= 2.7, < 5.0) net-telnet sfl - spring (2.0.0) + spring (2.0.2) activesupport (>= 4.2) spring-commands-rspec (1.0.4) spring (>= 0.9.1) spring-commands-sidekiq (1.0.0) spring (>= 0.9.1) sprint (1.1.0) - sprockets (3.7.0) + sprockets (3.7.1) concurrent-ruby (~> 1.0) rack (> 1, < 3) sprockets-rails (3.2.0) actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) - sqlite3 (1.3.12) + sqlite3 (1.3.13) syslog-logger (1.6.8) systemu (2.6.5) tapp (1.5.0) thor - term-ansicolor (1.4.0) + term-ansicolor (1.6.0) tins (~> 1.0) - therubyracer (0.12.2) - libv8 (~> 3.16.14.0) + therubyracer (0.12.3) + libv8 (~> 3.16.14.15) ref thor (0.19.4) - thread_safe (0.3.5) - tilt (2.0.5) + thread_safe (0.3.6) + tilt (2.0.7) timers (4.0.4) hitimes - tins (1.13.0) - tzinfo (1.2.2) + tins (1.14.0) + turnout (2.4.0) + i18n (~> 0.7) + rack (>= 1.3, < 3) + rack-accept (~> 0.4) + tilt (>= 1.4, < 3) + tzinfo (1.2.3) thread_safe (~> 0.1) - uglifier (3.0.4) + uglifier (3.2.0) execjs (>= 0.3.0, < 3) - unicode-display_width (1.1.1) - unicorn (5.2.0) + unicode-display_width (1.3.0) + unicorn (5.3.0) kgio (~> 2.6) raindrops (~> 0.7) unicorn-rails (2.2.1) @@ -520,12 +555,12 @@ GEM unicorn uniform_notifier (1.10.0) uuidtools (2.1.5) - varia_model (0.5.0) - buff-extensions (~> 1.0) + varia_model (0.6.0) + buff-extensions (~> 2.0) hashie (>= 2.0.2, < 4.0.0) - warden (1.2.6) + warden (1.2.7) rack (>= 1.0) - winrm (2.1.0) + winrm (2.2.3) builder (>= 2.1.2) erubis (~> 2.7) gssapi (~> 1.2) @@ -543,7 +578,7 @@ GEM rubyzip (~> 1.1) winrm (~> 2.0) wmi-lite (1.0.0) - yard (0.9.5) + yard (0.9.9) PLATFORMS ruby @@ -554,6 +589,7 @@ DEPENDENCIES awesome_print aws-sdk (~> 2) aws-sdk-v1 + awspec better_errors binding_of_caller browserify-rails @@ -564,7 +600,7 @@ DEPENDENCIES database_cleaner devise (~> 3.5.3) devise-i18n - factory_girl_rails + factory_girl_rails (~> 4.7.0) font-awesome-rails foreman github-markup @@ -584,7 +620,7 @@ DEPENDENCIES net-http-persistent (~> 2.9.4) net-scp net-ssh - nokogiri (>= 1.6.8) + nokogiri (>= 1.7.1) pry pry-doc pry-rails @@ -599,14 +635,14 @@ DEPENDENCIES redis redis-rails redis-store - ridley (~> 4.2.0) + ridley (~> 5) rotp rqrcode rspec-rails rubocop ruby-prof ruby_dep (~> 1.3.1) - rubyzip + rubyzip (>= 1.2.1) sass-rails sdoc serverspec @@ -623,9 +659,10 @@ DEPENDENCIES sqlite3 tapp therubyracer + turnout uglifier unicorn-rails yard BUNDLED WITH - 1.13.6 + 1.14.6 diff --git a/app/assets/javascripts/app_settings.js b/app/assets/javascripts/app_settings.js index 60e3462d1..96d3983fa 100644 --- a/app/assets/javascripts/app_settings.js +++ b/app/assets/javascripts/app_settings.js @@ -19,13 +19,16 @@ data: { key_select: null, creating: false, + optional: false, params: { log_directory: null, access_key: null, secret_access_key: null, aws_region: null, keypair_name: null, - keypair_value: null + keypair_value: null, + subnet_id: null, + vpc_id: null }, }, methods: { @@ -45,7 +48,6 @@ vm.keypair_name = file.name.replace(/\.\w+$/, ''); - console.log(vm); }, removeFile: function (e) { e.preventDefault(); @@ -181,18 +183,29 @@ var endpoint_base = '/app_settings'; var inputs_selector = '#app-settings-form input[type=text],input[type=password],select,textarea'; + var required_inputs = '#app-settings-form input[required],select[required],textarea[required]'; // -------------------------------- ajax methods - var create = function (settings) { - + var create = function (params) { + var settings = remove_empty_optional_params(params); return $.ajax({ url: endpoint_base, type: 'POST', data: { settings: JSON.stringify(settings) }, - }).fail(modal.AlertForAjaxStdError()); + }).fail(function (xhr) { + var res = xhr.responseJSON; + var kind = res.error.kind; + if (kind.endsWith('VpcIDNotFound')) { + modal.AlertHTML(kind, t('app_settings.msg.vpc_id_not_found', {id: _.escape(settings.vpc_id)}), 'danger'); + } else if (kind.endsWith('SubnetIDNotFound')) { + modal.AlertHTML(kind, t('app_settings.msg.subnet_id_not_found', {id: _.escape(settings.subnet_id)}), 'danger'); + } else { + modal.AlertForAjaxStdError()(xhr); + } + }); }; var chef_create = function () { @@ -211,25 +224,15 @@ // -------------------------------- utility methods - var is_fill_input = function() { - var set = get_settings(); - for (var i in set) { - if (set[i] === '') { - return false; - } - } - return true; - }; - - // inputが全部埋まっていれば btn をenableにする。 - // 全部埋まっていなければdisableにする - var switch_btn_enable = function (btn) { - if (is_fill_input()) { - btn.removeAttr('disabled'); - } else { - btn.attr('disabled', 'disabled'); - } + var remove_empty_optional_params = function (obj) { + var optional_keys = ['vpc_id', 'subnet_id']; + optional_keys.forEach(function (key) { + if (obj[key] === '' || obj[key] === null || obj[key] === undefined) { + delete obj[key]; + } + }); + return obj; }; @@ -279,5 +282,4 @@ }; - })(); diff --git a/app/assets/javascripts/databases.js b/app/assets/javascripts/databases.js new file mode 100644 index 000000000..641dc2c13 --- /dev/null +++ b/app/assets/javascripts/databases.js @@ -0,0 +1,31 @@ +// +// Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +// +// This software is released under the MIT License. +// +// http://opensource.org/licenses/mit-license.php +// + +(function () { + 'use strict'; + + Vue.component('div-loader', Loader); + var modal = require('modal'); + + var vm = new Vue({ + el: '#db-manage', + data: function () { + return { + loading_export: false, + loading_import: false, + }; + }, + computed: { + loading: function () { return this.loading_import || this.loading_export; }, + }, + methods: { + }, + ready: function () { + }, + }); +})(); diff --git a/app/assets/javascripts/infrastructures.js b/app/assets/javascripts/infrastructures.js index b10c3b27a..5642b3fac 100644 --- a/app/assets/javascripts/infrastructures.js +++ b/app/assets/javascripts/infrastructures.js @@ -46,7 +46,7 @@ Vue.component('ec2-tabpane', require('infrastructures/ec2-tabpane.js')); Vue.component('edit-runlist-tabpane', require('infrastructures/edit-runlist-tabpane.js')); Vue.component('edit-attr-tabpane', require('infrastructures/edit-attr-tabpane.js')); - Vue.component('serverspec-results-tabpane', require('infrastructures/serverspec-results-tabpane.js')); + Vue.component('servertest-results-tabpane', require('infrastructures/servertest-results-tabpane.js')); Vue.component('serverspec-tabpane', require('infrastructures/serverspec-tabpane.js')); Vue.component('operation-sched-tabpane', require('infrastructures/operation-sched-tabpane.js')); Vue.component('demo-grid', require('demo-grid.js')); diff --git a/app/assets/javascripts/infrastructures/add-modify-tabpane.js b/app/assets/javascripts/infrastructures/add-modify-tabpane.js index 0cc4d0e24..34b9198d3 100644 --- a/app/assets/javascripts/infrastructures/add-modify-tabpane.js +++ b/app/assets/javascripts/infrastructures/add-modify-tabpane.js @@ -39,4 +39,9 @@ module.exports = Vue.extend({ computed: { jsonParseErr: function () { return jsonParseErr(this.result.value); }, }, + filters:{ + created_at: function (date) { + return moment(date).format('YYYY/MM/D H:mm'); + }, + }, }); diff --git a/app/assets/javascripts/infrastructures/ec2-tabpane.js b/app/assets/javascripts/infrastructures/ec2-tabpane.js index 550b97492..4180c17fa 100644 --- a/app/assets/javascripts/infrastructures/ec2-tabpane.js +++ b/app/assets/javascripts/infrastructures/ec2-tabpane.js @@ -3,6 +3,7 @@ var Dish = require('models/dish').default; var EC2Instance = require('models/ec2_instance').default; var Snapshot = require('models/snapshot').default; var queryString = require('query-string').parse(location.search); +var ansi_up = require('ansi_up'); var helpers = require('infrastructures/helper.js'); var toLocaleString = helpers.toLocaleString; @@ -63,6 +64,7 @@ module.exports = Vue.extend({ change_status: t('ec2_instances.change_status'), attach_vol: t('ec2_instances.attach'), changing_status: t('ec2_instances.changing_status'), + is_yum_update: false, };}, methods: { @@ -185,7 +187,11 @@ module.exports = Vue.extend({ // cook end self.chef_console_text = ''; self.inprogress = false; - self._show_ec2(); + if (self.is_yum_update) { + self._prompt_yum_log(); + }else { + self._show_ec2(); + } }).progress(function (state, msg) { if (state !== 'update') {return;} @@ -205,6 +211,7 @@ module.exports = Vue.extend({ yum_update: function (security, exec) { var self = this; + self.is_yum_update = true; var infra = new Infrastructure(this.infra_id); var ec2 = new EC2Instance(infra, self.physical_id); @@ -218,17 +225,26 @@ module.exports = Vue.extend({ ).progress(function (state, msg) { // cook start success if(state !== 'start'){return;} - - alert_success(function () { self.inprogress = true; Vue.nextTick(function () { self.watch_cook(dfd); }); - })(msg); }); }); }, + _prompt_yum_log: function() { + var self = this; + self.is_yum_update = false; + + modal.ConfirmHTML(t('infrastructures.infrastructure'), t('nodes.msg.yum_update_success', {physical_id: self.physical_id}), 'success').done(function () { + self.$parent.tabpaneID = 'infra_logs'; + self._loading(); + }).fail(function () { + self._show_ec2(); + }); + }, + edit_runlist: function () { this.$parent.tabpaneID = 'edit_runlist'; this._loading(); @@ -237,7 +253,7 @@ module.exports = Vue.extend({ this.$parent.tabpaneID = 'edit_attr'; this._loading(); }, - select_serverspec: function () { + select_servertest: function () { this.$parent.tabpaneID = 'serverspec'; this._loading(); }, @@ -270,6 +286,7 @@ module.exports = Vue.extend({ is_first: function (idx) { return (idx === 0); }, runlist_type: function (run) { return run.replace(/\[.+\]$/, ""); }, runlist_name: function (run) { return run.replace(/^.+\[(.+)\]$/, "$1"); }, + ansi_up: function(log) { return ansi_up.ansi_to_html(log); }, _loading: function () { this.$parent.loading = true; }, @@ -597,20 +614,20 @@ module.exports = Vue.extend({ } return 'btn-default'; }, - has_rules: function() { + has_selected: function() { return has_selected(this.rules_summary); }, cook_status_class: function () { return this._label_class(this.cook_status); }, - serverspec_status_class: function () { return this._label_class(this.serverspec_status); }, + servertest_status_class: function () { return this._label_class(this.servertest_status); }, update_status_class: function () { return this._label_class(this.update_status); }, cook_status: function () { return this.capitalize(this.ec2.info.cook_status.value); }, - serverspec_status: function () { return this.capitalize(this.ec2.info.serverspec_status.value); }, + servertest_status: function () { return this.capitalize(this.ec2.info.servertest_status.value); }, update_status: function () { return this.capitalize(this.ec2.info.update_status.value); }, cook_time: function () { return this.cook_status === 'UnExecuted' ? '' : toLocaleString(this.ec2.info.cook_status.updated_at);}, - serverspec_time: function () { return this.serverspec_status === 'UnExecuted' ? '' : toLocaleString(this.ec2.info.serverspec_status.updated_at);}, + serverspec_time: function () { return this.servertest_status === 'UnExecuted' ? '' : toLocaleString(this.ec2.info.servertest_status.updated_at);}, update_time: function () { return this.update_status === 'UnExecuted' ? '' : toLocaleString(this.ec2.info.update_status.updated_at);}, runlist_empty: function () { return _.isEmpty(this.ec2.runlist); }, diff --git a/app/assets/javascripts/infrastructures/edit-monitoring-tabpane.js b/app/assets/javascripts/infrastructures/edit-monitoring-tabpane.js index 1dc72cad6..0d3aec22c 100644 --- a/app/assets/javascripts/infrastructures/edit-monitoring-tabpane.js +++ b/app/assets/javascripts/infrastructures/edit-monitoring-tabpane.js @@ -159,20 +159,24 @@ module.exports = Vue.extend({ self.postgresql_rds_host = null; self.$parent.loading = false; + + // Call Show only if monitoring edit call is successfull + self.monitoring.show().done(function (data) { + self.before_register = data.before_register; + self.linked_resources = data.linked_resources; + self.$parent.loading = false; + self.temp_loading = false; + }).fail(alert_and_show_infra(this.infra_id)); + + }).fail(function (xhr) { if (xhr.status === 400) { // before register zabbix self.$parent.show_monitoring(); } else { - alert_and_show_infra(this.infra_id)(xhr.responseText); + alert_and_show_infra(self.infra_id)(xhr.responseText); } }); - this.monitoring.show().done(function (data) { - self.before_register = data.before_register; - self.linked_resources = data.linked_resources; - self.$parent.loading = false; - self.temp_loading = false; - }).fail(alert_and_show_infra(this.infra_id)); }, filters: { diff --git a/app/assets/javascripts/infrastructures/edit-runlist-tabpane.js b/app/assets/javascripts/infrastructures/edit-runlist-tabpane.js index c01e828ca..afacbd543 100644 --- a/app/assets/javascripts/infrastructures/edit-runlist-tabpane.js +++ b/app/assets/javascripts/infrastructures/edit-runlist-tabpane.js @@ -30,7 +30,9 @@ module.exports = Vue.extend({ methods: { get_recipes: function () { var self = this; - if (self.recipes[self.selected_cookbook]) { return; } + + if (self.recipes[self.selected_cookbook]) { return; } // Avoid repeated call + if (self.selected_cookbook === null) { return; } // ignore no selected cookbook self.ec2.recipes(self.selected_cookbook).done(function (data) { Vue.set(self.recipes, self.selected_cookbook, data); diff --git a/app/assets/javascripts/infrastructures/infra-logs-tabpane.js b/app/assets/javascripts/infrastructures/infra-logs-tabpane.js index dce6e496e..c6da25158 100644 --- a/app/assets/javascripts/infrastructures/infra-logs-tabpane.js +++ b/app/assets/javascripts/infrastructures/infra-logs-tabpane.js @@ -3,6 +3,8 @@ var Infrastructure = require('models/infrastructure').default; var helpers = require('infrastructures/helper.js'); var toLocaleString = helpers.toLocaleString; var alert_and_show_infra = helpers.alert_and_show_infra; +var ansi_up = require('ansi_up'); + module.exports = Vue.extend({ template: '#infra-logs-tabpane-template', @@ -27,6 +29,7 @@ module.exports = Vue.extend({ status_class: function (status) { return status ? 'label-success' : 'label-danger'; }, status_text: function (status) { return status ? 'SUCCESS' : 'FAILED'; }, toLocaleString: toLocaleString, + ansi_up: function(log) { return ansi_up.ansi_to_html(log); } }, created: function () { diff --git a/app/assets/javascripts/infrastructures/serverspec-results-tabpane.js b/app/assets/javascripts/infrastructures/servertest-results-tabpane.js similarity index 82% rename from app/assets/javascripts/infrastructures/serverspec-results-tabpane.js rename to app/assets/javascripts/infrastructures/servertest-results-tabpane.js index 95d0acead..7637ed206 100644 --- a/app/assets/javascripts/infrastructures/serverspec-results-tabpane.js +++ b/app/assets/javascripts/infrastructures/servertest-results-tabpane.js @@ -8,7 +8,7 @@ var helpers = require('infrastructures/helper.js'); var alert_danger = helpers.alert_danger; module.exports = Vue.extend({ - template: '#serverspec-results-tabpane-template', + template: '#servertest-results-tabpane-template', replace: true, props: { @@ -32,7 +32,7 @@ module.exports = Vue.extend({ return { sortKey: '', sortOrders: sortOrders, - index: 'serverspec_results', + index: 'servertest_results', lang: null, pages: 10, pageNumber: 0, @@ -81,27 +81,27 @@ module.exports = Vue.extend({ created: function () { self = this; var self = this; - self.columns = ['serverspec', 'resource', 'message', 'status', 'created_at']; + self.columns = ['servertest', 'resource', 'message', 'status', 'created_at', 'category']; var temp_id = null; var serverspecs = []; - self.ec2.results_serverspec().done(function (data) { + self.ec2.results_servertest().done(function (data) { self.data = data.map(function (item) { + console.log(item) var last_log = (item.created_at ? new Date(item.created_at) : ''); return { - serverspec: item.serverspecs, + servertest: item.servertests, resource: item.resource.physical_id, message: [item.id, item.resource.physical_id, item.message, - item.serverspec_result_details], + item.servertest_result_details], status: item.status, - created_at: last_log.toLocaleString() + created_at: last_log.toLocaleString(), + category: item.servertests, }; }); self.$parent.loading = false; - $("#loading_results").hide(); - var empty = t('serverspecs.msg.empty-results'); - if(self.data.length === 0){ $('#empty_results').show().html(empty);} + if(self.data.length === 0){ self.is_empty = true; } }).fail(alert_danger(self.show_ec2)); }, }); diff --git a/app/assets/javascripts/modules/listen.js b/app/assets/javascripts/modules/listen.js index 8ef321fc1..54d7ecb5a 100644 --- a/app/assets/javascripts/modules/listen.js +++ b/app/assets/javascripts/modules/listen.js @@ -5,151 +5,151 @@ // // http://opensource.org/licenses/mit-license.php // +(function () { + 'use_strict'; -module.exports = function (value, key, index, lang) { - switch (index) { - case 'infrastructures': - return render_infrastructures(value, key, lang); - case 'projects': - return render_projects(value, key, lang); - case 'clients': - return render_clients(value, key, lang); - case 'serverspecs': - return render_serverspecs(value, key, lang); - case 'dishes': - return render_dish(value, key, lang); - case 'cf_templates': - return render_cf_templates(value, key, lang); - case 'user_admin': - return render_user_admin(value, key, lang); - case 'serverspec_results': - return render_serverspecs_results(value, key, lang); - default: - return value; - } -}; - + module.exports = function (value, key, index, lang) { -function render_infrastructures(value, key, lang){ - if (key === 'status') { - switch (value) { - case 'CREATE_COMPLETE': - return ""+value+""; - case 'DELETE_IN_PROGRESS': - return ""+value+""; - case 'CREATE_IN_PROGRESS': - return ""+value+""; + switch (index) { + case 'infrastructures': + return render_infrastructures(value, key, lang); + case 'projects': + return render_projects(value, key, lang); + case 'clients': + return render_clients(value, key, lang); + case 'serverspecs': + return render_serverspecs(value, key, lang); + case 'dishes': + return render_dish(value, key, lang); + case 'cf_templates': + return render_cf_templates(value, key, lang); + case 'user_admin': + return render_user_admin(value, key, lang); + case 'servertest_results': + return render_servertests_results(value, key, lang); default: - return " NO_STACK_INFO "; + return value; } - }else if (key === 'stack_name') { - return ''; - }else{ - return value; - } -} + }; -function render_clients(value, key, lang){ - if (key === 'code') { - return value[0]+" "+value[1] +" "+ t ('clients.projects')+""; - }else{ - return value; - } -} -function render_projects(value, key, lang){ - if (key === 'code') { - return value[0]+" "+value[1] +" "+ t ('projects.infras')+""; - }else{ - return value; + function render_infrastructures(value, key, lang){ + if (key === 'status') { + switch (value) { + case 'CREATE_COMPLETE': + return ""+value+""; + case 'DELETE_IN_PROGRESS': + return ""+value+""; + case 'CREATE_IN_PROGRESS': + return ""+value+""; + default: + return " NO_STACK_INFO "; + } + }else if (key === 'stack_name') { + return ''; + }else{ + return value; + } } -} -function render_serverspecs(value, key, lang){ - if (key !== 'serverspec_name') + function render_clients(value, key, lang){ + if (key === 'code') { + return value[0]+" "+value[1] +" "+ t ('clients.projects')+""; + }else{ return value; -} + } + } -function render_cf_templates(value, key, lang){ - if(key !== 'cf_subject') + function render_projects(value, key, lang){ + if (key === 'code') { + return value[0]+" "+value[1] +" "+ t ('projects.infras')+""; + }else{ return value; -} - -function render_dish(value, key, lang){ - if (key === 'status') { - var label = null; - if(value === 'SUCCESS'){ - label = 'label-success'; - }else if (value === 'FAILURE') { - label = 'label-danger'; - }else if (value === 'CREATING' || value === 'BOOTSTRAPPING' || value === 'APPLYING' || value === 'SERVERSPEC') { - label = 'label-info'; - }else { - label = 'label-warning'; - value = 'NOT YET'; } - return ""+value+""; - }else if (key === 'dish_name') { - return ''; - }else{ - return value; } -} -function render_user_admin(value, key, lang){ - if(key === 'role'){ - return value[0]+" "+value[1]; - }else if (key === 'email') { - return value[0]+" "+value[1]+" "+value[2]; - }else { + function render_serverspecs(value, key, lang){ + return (key !== 'serverspec_name') ? value : ''; + } + + function render_cf_templates(value, key, lang){ + return (key !== 'cf_subject') ? value : ''; + } + + function render_dish(value, key, lang){ + if (key === 'status') { + var label = null; + if(value === 'SUCCESS'){ + label = 'label-success'; + }else if (value === 'FAILURE') { + label = 'label-danger'; + }else if (value === 'CREATING' || value === 'BOOTSTRAPPING' || value === 'APPLYING' || value === 'SERVERSPEC') { + label = 'label-info'; + }else { + label = 'label-warning'; + value = 'NOT YET'; + } + return ""+value+""; + }else if (key === 'dish_name') { + return ''; + }else{ return value; } -} + } -function render_serverspecs_results(value, key){ - if(key === 'status'){ - var ret; - switch (value) { - case 'success': - ret = ""+value+""; - break; - case 'failed': - ret = ""+value+""; - break; - case 'pending': - ret = ""+value+""; - break; - } - return ret; - }else if (key === 'serverspec') { - if(value.length > 0){ - var values = []; - $.each(value, function(index, value){ - values.push(" "+value.name); - }); - return values; - }else { - return 'auto generated'; - } - }else if (key === 'message') { - if(value[3].length <= 0){ - return " serverspec for "+value[1]+" is successfully finished. "; - }else{ - var head = "Serverspec for "+value[1]+" ... "; - var body = ''; - if(value[2]){ - body = "
" + - "" + - "
" + - "
"+value[2]+"
" + - "
" + - "" + - "
"; + function render_user_admin(value, key, lang){ + if(key === 'role'){ + return value[0]+" "+value[1]; + }else if (key === 'email') { + return value[0]+" "+value[1]+" "+value[2]; + }else { + return value; } + } + + function render_servertests_results(value, key){ + switch (key) { + case 'status': + if(value == 'success') { + return ""+value+""; + }else if (value == 'failed') { + return ""+value+""; + }else if (value == 'pending') { + return ""+value+""; + }else{ return value; } + break; + case 'servertest': + return (value.length > 0) ? value.map(function(val){ return val.name; }) : 'auto generated'; + case 'category': + var category = []; + value.forEach(function (argument) { + if (!category.includes(argument.category)) + category.push(argument.category); + }); - return head+body; + return (value.length > 0) ? category : 'serverspec'; + + case 'message': + if(value[3].length <= 0){ + return " serverspec for "+value[1]+" is successfully finished. "; + }else{ + var head = "Serverspec for "+value[1]+" ... "; + var body = ''; + if(value[2]){ + body = "
" + + "" + + "
" + + "
"+value[2]+"
" + + "
" + + "" + + "
"; + } + return head+body; + }break; + default: + return value; } - }else{ - return value; - } } + +})(); + diff --git a/app/assets/javascripts/modules/wrap.js b/app/assets/javascripts/modules/wrap.js index 3a23e4d8a..4874325c3 100644 --- a/app/assets/javascripts/modules/wrap.js +++ b/app/assets/javascripts/modules/wrap.js @@ -14,16 +14,16 @@ module.exports = function(value, index){ return render_projects(value); case 'clients': return render_clients(value); - case 'serverspecs': - return render_serverspecs(value); + case 'servertests': + return render_servertests(value); case 'dishes': return render_dish(value); case 'cf_templates': return render_cf_templates(value); case 'user_admin': return render_user_admin(value); - case 'serverspec_results': - return render_serverspecs_results(value); + case 'servertest_results': + return render_servertests_results(value); case 'operation_sched': return render_ops_sched(value); default: @@ -75,12 +75,14 @@ function render_clients(value){ } } -function render_serverspecs(value){ +function render_servertests(value){ switch (value) { case 'description': - return t ('serverspecs.description'); - case 'serverspec_name': - return t ('serverspecs.name'); + return t ('servertests.description'); + case 'servertest_name': + return t ('servertests.name'); + case 'category': + return t ('servertests.category'); default: return value; } @@ -123,18 +125,18 @@ function render_user_admin(value){ } } -function render_serverspecs_results(value){ +function render_servertests_results(value){ switch (value) { - case 'serverspec': - return t('serverspecs.serverspecs'); + case 'servertest': + return t('servertests.servertests'); case 'resource': - return t('serverspecs.generator.resources'); + return t('servertests.generator.resources'); case 'message': return t('cf_templates.details'); case 'status': return t ('infrastructures.status'); case 'created_at': - return t ('serverspecs.created_at'); + return t ('servertests.created_at'); default: return value; } diff --git a/app/assets/javascripts/serverspecs.js b/app/assets/javascripts/serverspecs.js deleted file mode 100644 index babaf8903..000000000 --- a/app/assets/javascripts/serverspecs.js +++ /dev/null @@ -1,76 +0,0 @@ -// -// Copyright (c) 2013-2016 SKYARCH NETWORKS INC. -// -// This software is released under the MIT License. -// -// http://opensource.org/licenses/mit-license.php -// - -//browserify functions for vue filters functionality -var wrap = require('./modules/wrap'); -var listen = require('./modules/listen'); -var queryString = require('query-string').parse(location.search); -var modal = require('modal'); -var app; - -Vue.component('demo-grid', require('demo-grid.js')); -var serverspec_url = queryString.infrastructure_id ? 'infrastructure_id='+queryString.infrastructure_id: ''; - -var serverspecIndex = new Vue({ - el: '#indexElement', - data: { - searchQuery: '', - gridColumns: ['serverspec_name','description'], - gridData: [], - index: 'serverspecs', - picked: { - serverspec_path: null, - edit_serverspec_path: null - }, - infra_id: queryString.infrastructure_id ? '&infrastructure_id='+queryString.infrastructure_id: '', - url: 'serverspecs?'+serverspec_url, - is_empty: false, - loading: true, - }, - methods: { - can_edit: function() { - return this.picked.edit_serverspec_path === null ? true : false; - }, - can_delete: function() { - return (this.picked.serverspec_path === null) ? true: false; - }, - delete_entry: function() { - var self = this; - modal.Confirm(t('serverspecs.serverspec'), t('serverspecs.msg.delete_serverspec'), 'danger').done(function () { - $.ajax({ - type: "POST", - url: self.picked.serverspec_path, - dataType: "json", - data: {"_method":"delete"}, - success: function (data) { - location.reload(); - }, - }).fail(modal.AlertForAjaxStdError()); - }); - }, - reload: function () { - this.loading = true; - this.$children[0].load_ajax(this.url); - this.picked = {}; - }, - show_serverspec: function(serverspec_id) { - $.ajax({ - url : "/serverspecs/" + serverspec_id, - type : "GET", - success : function (data) { - $("#value-information").html(data); - } - }); - document.getElementById('value').style.display=''; - } - }, -}); - - - -require("serverspec-gen"); diff --git a/app/assets/javascripts/servertests.js b/app/assets/javascripts/servertests.js new file mode 100644 index 000000000..44fe973ea --- /dev/null +++ b/app/assets/javascripts/servertests.js @@ -0,0 +1,124 @@ +// +// Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +// +// This software is released under the MIT License. +// +// http://opensource.org/licenses/mit-license.php +// + +//browserify functions for vue filters functionality +var wrap = require('./modules/wrap'); +var listen = require('./modules/listen'); +var queryString = require('query-string').parse(location.search); +var modal = require('modal'); + +var Servertest = require('models/servertest').default; +var vace = require('vue-ace'); +require('brace/mode/ruby'); +require('brace/theme/github'); +Vue.use(vace, false, 'ruby', '25'); + +Vue.component('demo-grid', require('demo-grid.js')); +var servertest_url = queryString.infrastructure_id ? 'infrastructure_id='+queryString.infrastructure_id: ''; + +var servertestIndex = new Vue({ + el: '#indexElement', + data: { + searchQuery: '', + gridColumns: ['servertest_name','description', 'category'], + gridData: [], + index: 'servertests', + picked: { + servertest_path: null, + edit_servertest_path: null + }, + infra_id: queryString.infrastructure_id ? '&infrastructure_id='+queryString.infrastructure_id: '', + sel_infra_id: null, + url: 'servertests?'+servertest_url, + is_empty: false, + loading: true, + generating: false, + awspec:{ + value: null, + fname: null + } + }, + methods: { + can_edit: function() { + return this.picked.edit_servertest_path === null ? true : false; + }, + can_delete: function() { + return (this.picked.servertest_path === null) ? true: false; + }, + delete_entry: function() { + var self = this; + console.log(self.picked.servertest_path); + modal.Confirm(t('servertests.servertest'), t('servertests.msg.delete_servertest'), 'danger').done(function () { + $.ajax({ + type: "POST", + url: self.picked.servertest_path, + dataType: "json", + data: {"_method":"delete"}, + success: function (data) { + location.reload(); + }, + }).fail(modal.AlertForAjaxStdError()); + }); + }, + reload: function () { + this.loading = true; + this.$children[0].load_ajax(this.url); + this.picked = {}; + }, + show_servertest: function(servertest_id) { + $.ajax({ + url : "/servertests/" + servertest_id, + type : "GET", + success : function (data) { + $("#value-information").html(data); + } + }); + document.getElementById('value').style.display=''; + }, + generate: function () { + var self = this; + self.generating = true; + + var svt = new Servertest(self.sel_infra_id); + svt.generate_awspec().done(function (data) { + self.awspec.value = data.generated; + self.generating = false; + }).fail(modal.AlertForAjaxStdError()); + }, + create_awspec: function () { + var self = this; + var params = self.awspec; + self.generating = true; + + var svt = new Servertest(self.sel_infra_id); + svt.create(params.fname, params.value, 'awspec').done(function (data) { + modal.Alert(t('servertests.servertest'), data, 'success').done(function(){ + location.href = "/servertests?infrastructure_id="+self.sel_infra_id+location.search; + }); + } + ).fail(function (msg) { + modal.Alert(t('servertests.servertest'), msg, 'danger'); + self.generating = false; + }); + } + }, + computed: { + required_filed: function () { + var awspec = this.awspec; + return (awspec.value && awspec.fname); + }, + }, + ready: function() { + var self = this; + self.loading = false; + } +}); + + + +require("serverspec-gen"); diff --git a/app/assets/javascripts/zabbix_servers.js b/app/assets/javascripts/zabbix_servers.js index 6b2d4ac61..9b8eed5ee 100644 --- a/app/assets/javascripts/zabbix_servers.js +++ b/app/assets/javascripts/zabbix_servers.js @@ -12,14 +12,9 @@ var wrap = require('./modules/wrap'); var listen = require('./modules/listen'); var md5 = require('md5'); - var queryString = require('query-string').parse(location.search); + var qs = require('query-string').parse(location.search); var modal = require('modal'); var ZabbixServer = require('models/zabbix_server').default; - var helpers = require('infrastructures/helper.js'); - var alert_success = helpers.alert_success; - var alert_danger = helpers.alert_danger; - - var app; Vue.component('demo-grid', require('demo-grid.js')); @@ -31,7 +26,7 @@ gridColumns: ['fqdn', 'version', 'details'], gridData: [], index: 'zabbix_servers', - url: 'zabbix_servers?lang='+queryString.lang, + url: 'zabbix_servers?lang='+qs.lang, is_empty: false, loading: true, new_loader: false, @@ -44,7 +39,7 @@ username: null, password: null, details: null, - lang: queryString.lang + lang: qs.lang }, control_type: null }, diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index c6fbc01fe..b110894fd 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -199,6 +199,7 @@ h6.page-header { .recipes-selectbox-height { height: 285px !important; + background-image: none !important; } .runlist-selectbox-height { diff --git a/app/assets/stylesheets/bootstrap_extend.css b/app/assets/stylesheets/bootstrap_extend.css index e855587a6..0aa7ac1d0 100644 --- a/app/assets/stylesheets/bootstrap_extend.css +++ b/app/assets/stylesheets/bootstrap_extend.css @@ -346,3 +346,8 @@ pre { .instructions{ color: #444444;; } + +.terminal-ansi{ + color: #b2dbfb !important; + background-color: #212121 !important; +} diff --git a/app/assets/stylesheets/nodes.css b/app/assets/stylesheets/nodes.css index 07ac6e3ac..6bd6e0474 100644 --- a/app/assets/stylesheets/nodes.css +++ b/app/assets/stylesheets/nodes.css @@ -1,5 +1,6 @@ .pre-progress { overflow: auto; height: 300px; - color: gray; + color: #b2dbfb !important; + background-color: #212121 !important; } diff --git a/app/controllers/app_settings_controller.rb b/app/controllers/app_settings_controller.rb index c376c042a..fb50d275e 100644 --- a/app/controllers/app_settings_controller.rb +++ b/app/controllers/app_settings_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -9,13 +9,14 @@ class AppSettingsController < ApplicationController before_action :authenticate_user!, except: [:show, :create, :chef_create] - before_action except: [:edit_zabbix, :update_zabbix, :chef_server, :chef_keys, :db, :export_db] do + before_action except: [:edit_zabbix, :update_zabbix, :chef_server, :chef_keys] do if AppSetting.set? redirect_to root_path end end class AppSettingError < ::StandardError; end + CF_PARAMS_KEY = 'cf_params'.freeze # GET /app_settings def show @@ -30,7 +31,26 @@ def create keypair_name = settings.delete(:keypair_name) keypair_value = settings.delete(:keypair_value) - check_eip_limit!(settings[:aws_region], access_key, secret_access_key) + vpc_id = settings.delete(:vpc_id) + subnet_id = settings.delete(:subnet_id) + + set_ec2(settings[:aws_region], access_key, secret_access_key) + + cf_params = {} + + if vpc_id + verify_vpc_id!(vpc_id) + cf_params[:VpcId] = vpc_id + end + + if subnet_id + verify_subnet_id!(subnet_id) + cf_params[:SubnetId] = subnet_id + end + + check_eip_limit! + + Rails.cache.write(CF_PARAMS_KEY, cf_params) ec2key = Ec2PrivateKey.create!( name: keypair_name, @@ -62,7 +82,7 @@ def create set = AppSetting.get stack_name = "SkyHopperZabbixServer-#{Digest::MD5.hexdigest(DateTime.now.in_time_zone.to_s)}" - ChefServer::Deployment.create_zabbix(stack_name, set.aws_region, set.ec2_private_key.name, set.ec2_private_key.value) + ChefServer::Deployment.create_zabbix(stack_name, set.aws_region, set.ec2_private_key.name, set.ec2_private_key.value, cf_params) end render text: I18n.t('app_settings.msg.created') and return @@ -122,11 +142,14 @@ def chef_create CfTemplate # rubocop:enable Lint/Void + cf_params = Rails.cache.fetch(CF_PARAMS_KEY) || {} + Rails.cache.delete(CF_PARAMS_KEY) + Thread.new_with_db do ws = WSConnector.new('chef_server_deployment', 'status') begin - ChefServer::Deployment.create(stack_name, region, keypair_name, keypair_value) do |data, msg| + ChefServer::Deployment.create(stack_name, region, keypair_name, keypair_value, cf_params) do |data, msg| Rails.logger.debug("ChefServer creating > #{data} #{msg}") ws.push(build_ws_message(data, msg)) end @@ -193,13 +216,6 @@ def chef_keys @zipfile.close end - # GET /app_settings/export_db - def export_db - prepare_db_zip - send_file(@zipfile.path, filename: "SkyHopper-db-#{Rails.env}.zip") - @zipfile.close - end - private # statusに対応するメッセージをJSONとして返す @@ -215,45 +231,36 @@ def build_ws_message(status, msg = nil) return JSON.generate(hash) end + def set_ec2(region, access_key_id, secret_access_key) + @ec2 = Aws::EC2::Client.new(region: region, access_key_id: access_key_id, secret_access_key: secret_access_key) + end + class EIPLimitError < StandardError; end # @param [String] region # @param [String] access_key_id # @param [String] secret_access_key # @raise [EIPLimitError] raise error when cann't allocate EIP. - def check_eip_limit!(region, access_key_id, secret_access_key) - e = Aws::EC2::Client.new(region: region, access_key_id: access_key_id, secret_access_key: secret_access_key) - a = e.describe_account_attributes + def check_eip_limit! + a = @ec2.describe_account_attributes limit = a.account_attributes.find{|x| x.attribute_name == 'vpc-max-elastic-ips'}.attribute_values.first.attribute_value.to_i - n = e.describe_addresses.addresses.size + n = @ec2.describe_addresses.addresses.size if limit - n < 2 raise EIPLimitError, I18n.t('app_settings.msg.eip_limit_error') end end + def verify_vpc_id!(vpc_id) + @ec2.describe_vpcs(vpc_ids: [vpc_id]) + end + + def verify_subnet_id!(subnet_id) + @ec2.describe_subnets(subnet_ids: [subnet_id]) + end + def prepare_chef_key_zip @zipfile = Tempfile.open('chef') zf = ZipFileGenerator.new(File.expand_path('~/.chef'), @zipfile.path) zf.write end - - def prepare_db_zip - dbname = ActiveRecord::Base.configurations[Rails.env]['database'] - filename = "#{dbname}.sql" - path = Rails.root.join("tmp/#{filename}") - - system('rake db:data:dump') - - @zipfile = Tempfile.open("skyhopper") - ::Zip::File.open(@zipfile.path, ::Zip::File::CREATE) do |zip| - zip.add(filename, path) - - SkyHopper::Application.secrets.each do |key, value| - next if value.nil? - zip.get_output_stream(key) { |io| io.write(value) } - end - end - - FileUtils.rm(path) - end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 9c8bb5e4b..dada70bff 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/cf_templates_controller.rb b/app/controllers/cf_templates_controller.rb index 3a8e6653e..df5d5b1fc 100644 --- a/app/controllers/cf_templates_controller.rb +++ b/app/controllers/cf_templates_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/clients_controller.rb b/app/controllers/clients_controller.rb index c11f473ee..4b18699cf 100644 --- a/app/controllers/clients_controller.rb +++ b/app/controllers/clients_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/concerns/controller_util.rb b/app/controllers/concerns/controller_util.rb index 134f3520e..0beef8f68 100644 --- a/app/controllers/concerns/controller_util.rb +++ b/app/controllers/concerns/controller_util.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/concerns/error_handler.rb b/app/controllers/concerns/error_handler.rb index 4f3b972fb..5f1eb9aeb 100644 --- a/app/controllers/concerns/error_handler.rb +++ b/app/controllers/concerns/error_handler.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/concerns/infra_logger.rb b/app/controllers/concerns/infra_logger.rb index 02a971316..8a1c66c3b 100644 --- a/app/controllers/concerns/infra_logger.rb +++ b/app/controllers/concerns/infra_logger.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/databases_controller.rb b/app/controllers/databases_controller.rb new file mode 100644 index 000000000..0666ab92d --- /dev/null +++ b/app/controllers/databases_controller.rb @@ -0,0 +1,63 @@ +# +# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# +# This software is released under the MIT License. +# +# http://opensource.org/licenses/mit-license.php +# + +class DatabasesController < ApplicationController + skip_before_action :appsetting_set? + + before_action if: :app_setting_is_set do + authenticate_user! + + man = DatabaseManager.new + def man.policy_class; DatabasePolicy end + authorize man + end + + helper_method :app_setting_is_set + + # POST /databases/export + def export + authenticate_user! + + time = Time.now.strftime('%Y%m%d%H%M%S') + zipfile = DatabaseManager.export_as_zip + send_file(zipfile.path, filename: "SkyHopper-db-#{Rails.env}-#{time}.zip") + zipfile.close + end + + # POST /databases/import + def import + file = params.require(:file) + + DatabaseManager.validate_zip_file!(file.path) + + reason = I18n.available_locales.map { |locale| + I18n.t('databases.msg.under_maintenance', locale: locale) + }.join + MaintenanceMode.activate(reason: reason) + + Thread.new do + import_zip(file) + end + + redirect_to root_path + end + + private + def app_setting_is_set + @app_setting_is_set ||= AppSetting.set? + end + + def import_zip(file) + DatabaseManager.import_from_zip(file.path) + rescue => ex + Rails.cache.write(:err, "#{ex.inspect}\n#{ex.backtrace.join}") + ensure + file.close + MaintenanceMode.deactivate + end +end diff --git a/app/controllers/dishes_controller.rb b/app/controllers/dishes_controller.rb index 6504b4bd4..12a2fa9ca 100644 --- a/app/controllers/dishes_controller.rb +++ b/app/controllers/dishes_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -36,7 +36,7 @@ def index # GET /dishes/1 def show - @selected_serverspecs = @dish.serverspecs + @selected_serverspecs = @dish.servertests @runlist = @dish.runlist render partial: 'show' @@ -44,13 +44,13 @@ def show # GET /dishes/1/edit def edit - @global_serverspecs = Serverspec.global + @global_serverspecs = Servertest.global @cookbooks = ChefAPI.index(:cookbook).keys @roles = ChefAPI.index(:role).map(&:name) @runlist = @dish.runlist - @selected_serverspecs = @dish.serverspecs + @selected_serverspecs = @dish.servertests render partial: 'edit' end @@ -58,12 +58,12 @@ def edit # PUT /dishes/1 def update runlist = params[:runlist] || [] - serverspec_ids = params[:serverspecs] || [] + servertest_ids = params[:servertests] || [] # TODO error handling @dish.update( runlist: runlist, - serverspec_ids: serverspec_ids, + servertest_ids: servertest_ids, status: nil ) diff --git a/app/controllers/dishes_controller/validate.rb b/app/controllers/dishes_controller/validate.rb index 2fb5941cf..90a13ea6c 100644 --- a/app/controllers/dishes_controller/validate.rb +++ b/app/controllers/dishes_controller/validate.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/ec2_instances_controller.rb b/app/controllers/ec2_instances_controller.rb index 2cb3cccdc..0a668d9c7 100644 --- a/app/controllers/ec2_instances_controller.rb +++ b/app/controllers/ec2_instances_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -156,7 +156,7 @@ def reboot # @return [String] JSON. {status: Boolean} def serverspec_status physical_id = params.require(:id) - status = ! Resource.find_by(physical_id: physical_id).status.serverspec.failed? + status = ! Resource.find_by(physical_id: physical_id).status.servertest.failed? render json: {status: status} end diff --git a/app/controllers/ec2_private_keys_controller.rb b/app/controllers/ec2_private_keys_controller.rb index f09716c69..69e19e393 100644 --- a/app/controllers/ec2_private_keys_controller.rb +++ b/app/controllers/ec2_private_keys_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/elb_controller.rb b/app/controllers/elb_controller.rb index 3182a825c..372f7e82b 100755 --- a/app/controllers/elb_controller.rb +++ b/app/controllers/elb_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/infrastructure_logs_controller.rb b/app/controllers/infrastructure_logs_controller.rb index 1685ebb25..39ae22e74 100644 --- a/app/controllers/infrastructure_logs_controller.rb +++ b/app/controllers/infrastructure_logs_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/infrastructures_controller.rb b/app/controllers/infrastructures_controller.rb index d53ca63f5..e8fecd328 100644 --- a/app/controllers/infrastructures_controller.rb +++ b/app/controllers/infrastructures_controller.rb @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/key_pairs_controller.rb b/app/controllers/key_pairs_controller.rb index 3cd7b712d..5e7b12529 100644 --- a/app/controllers/key_pairs_controller.rb +++ b/app/controllers/key_pairs_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/monitorings_controller.rb b/app/controllers/monitorings_controller.rb index 3e44161fd..2f3c2c697 100644 --- a/app/controllers/monitorings_controller.rb +++ b/app/controllers/monitorings_controller.rb @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -295,7 +295,8 @@ def set_infra end def set_zabbix - @zabbix_server = ZabbixServer.find(@infra.project[:zabbix_server_id]) + @zabbix_server = @infra.project.zabbix_server + raise t('projects.msg.zabbix_not_set') unless @zabbix_server @zabbix = Zabbix.new(@zabbix_server.fqdn, current_user.email, current_user.encrypted_password) end end diff --git a/app/controllers/nodes_controller.rb b/app/controllers/nodes_controller.rb index 02625480c..fbcdf1765 100644 --- a/app/controllers/nodes_controller.rb +++ b/app/controllers/nodes_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -105,7 +105,7 @@ def show @info = {} status = resource.status @info[:cook_status] = status.cook - @info[:serverspec_status] = status.serverspec + @info[:servertest_status] = status.servertest @info[:update_status] = status.yum @dishes = Dish.valid_dishes(@infra.project_id) @@ -371,7 +371,7 @@ def update_runlist(physical_id: nil, infrastructure: nil, runlist: nil, dish_id: # change cookstatus to unexected r.status.cook.un_executed! - r.status.serverspec.un_executed! + r.status.servertest.un_executed! infra_logger_success("Updating runlist for #{physical_id} is successfully updated.") return {status: true, message: nil} @@ -385,7 +385,7 @@ def cook_node(infrastructure, physical_id, whyrun) r = infrastructure.resource(physical_id) r.status.cook.inprogress! - r.status.serverspec.un_executed! + r.status.servertest.un_executed! node = Node.new(physical_id) node.wait_search_index log = [] @@ -415,7 +415,7 @@ def cook_node(infrastructure, physical_id, whyrun) ws.push_as_json({v: true}) if r.dish_id # if resource has dish - ServerspecJob.perform_now(physical_id, @infra.id, current_user.id) + ServertestJob.perform_now(physical_id, @infra.id, current_user.id) end end @@ -430,7 +430,7 @@ def exec_yum_update(infra, physical_id, security=true, exec=false) r = this_infra.resource(physical_id) r.status.yum.inprogress! - r.status.serverspec.un_executed! if exec + r.status.servertest.un_executed! if exec node = Node.new(physical_id) diff --git a/app/controllers/project_parameters_controller.rb b/app/controllers/project_parameters_controller.rb index 1d7343132..019279214 100644 --- a/app/controllers/project_parameters_controller.rb +++ b/app/controllers/project_parameters_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index bc0c23875..f70326389 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -76,14 +76,19 @@ def edit # POST /projects # POST /projects.json def create - @project = Project.new(project_params) - @zabbix = ZabbixServer.find(@project.zabbix_server_id) - on_error = -> () { session[:form] = project_params redirect_to new_project_path(client_id: params[:project][:client_id]) } + zid = project_params[:zabbix_server_id] + if zid.empty? + flash[:alert] = t('projects.msg.zabbix_not_set') + on_error.() and return + end + @zabbix = ZabbixServer.find(zid) + + @project = Project.new(project_params) unless @project.save flash[:alert] = @project.errors on_error.() and return @@ -106,7 +111,13 @@ def create # PATCH/PUT /projects/1 # PATCH/PUT /projects/1.json def update - @zabbix = ZabbixServer.find(project_params[:zabbix_server_id]) + zid = project_params[:zabbix_server_id] + if zid.empty? + flash[:alert] = t('projects.msg.zabbix_not_set') + redirect_to edit_project_path and return + end + + @zabbix = ZabbixServer.find(zid) if @project.update(project_params) register_hosts redirect_to projects_path(client_id: @project.client_id), diff --git a/app/controllers/resources_controller.rb b/app/controllers/resources_controller.rb index 35c6d29cc..4818ccbcf 100644 --- a/app/controllers/resources_controller.rb +++ b/app/controllers/resources_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/root_controller.rb b/app/controllers/root_controller.rb index 78510162d..03b03e491 100644 --- a/app/controllers/root_controller.rb +++ b/app/controllers/root_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/server_status_controller.rb b/app/controllers/server_status_controller.rb index 027db8808..6da1c3547 100644 --- a/app/controllers/server_status_controller.rb +++ b/app/controllers/server_status_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/serverspecs_controller.rb b/app/controllers/serverspecs_controller.rb deleted file mode 100644 index 9a64b398a..000000000 --- a/app/controllers/serverspecs_controller.rb +++ /dev/null @@ -1,220 +0,0 @@ -# -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. -# -# This software is released under the MIT License. -# -# http://opensource.org/licenses/mit-license.php -# - -class ServerspecsController < ApplicationController - include Concerns::InfraLogger - - before_action :set_serverspec, only: [:update, :show, :edit, :destroy] - - # --------------- Auth - before_action :authenticate_user! - - before_action do - authorize(@serverspec || Serverspec.new(infrastructure_id: have_infra?)) - end - - # GET /serverspecs - def index - @infrastructure_id = params[:infrastructure_id] - page = params[:page] - - @infrastructure_name = Infrastructure.find(@infrastructure_id).stack_name if @infrastructure_id - @serverspecs = Serverspec.where(infrastructure_id: @infrastructure_id).page(page) - - respond_to do |format| - format.json - format.html - end - end - - # GET /serverspecs/new - def new - infra_id = params[:infrastructure_id] - - @serverspec = Serverspec.new(infrastructure_id: infra_id) - @serverspec.value = %!require 'serverspec_helper'\n\n! - end - - # GET /serverspecs/1 - def show - render text: @serverspec.value - end - - # POST /serverspecs/1 - def update - if @serverspec.update(global_serverspec_params) - redirect_to serverspecs_path, notice: I18n.t('serverspecs.msg.updated') - else - flash.now[:alert] = @serverspec.errors[:value] if @serverspec.errors[:value] - render action: 'edit' - end - end - - # POST /serverspecs - def create - @serverspec = Serverspec.new(global_serverspec_params) - - infra_id = @serverspec.infrastructure_id - - begin - @serverspec.save! - rescue => ex - raise ex if ajax? - flash.now[:alert] = @serverspec.errors[:value] if @serverspec.errors[:value] - render action: 'new', infrastructure_id: infra_id; return - end - - if ajax? - render text: I18n.t('serverspecs.msg.created') and return - else - redirect_to serverspecs_path(infrastructure_id: infra_id), - notice: I18n.t('serverspecs.msg.created') - end - end - - # GET /serverspecs/1/edit - def edit - end - - # GET /serverspecs/generator - def generator - @infra = Infrastructure.find(params[:infrastructure_id]) if params[:infrastructure_id] - end - - # DELETE /serverspecs/1 - def destroy - infra_id = @serverspec.infrastructure_id - @serverspec.destroy - - redirect_to serverspecs_path(infrastructure_id: infra_id), notice: I18n.t('serverspecs.msg.deleted') - end - - # GET /serverspecs/select - def select - physical_id = params.require(:physical_id) - infra_id = params.require(:infra_id) - - resource = Resource.where(infrastructure_id: infra_id).find_by(physical_id: physical_id) - @selected_serverspec_ids = resource.all_serverspec_ids - - serverspecs = Serverspec.for_infra(infra_id) - @individual_serverspecs, @global_serverspecs = serverspecs.partition{|spec| spec.infrastructure_id } - node = Node.new(physical_id) - @is_available_auto_generated = node.have_auto_generated - - @serverspec_schedule = ServerspecSchedule.find_or_create_by(physical_id: physical_id) - end - - # GET /serverspecs/results - def results - physical_id = params.require(:physical_id) - infra_id = params.require(:infra_id) - resource = Resource.where(infrastructure_id: infra_id).find_by(physical_id: physical_id) - - @serverspec_results = resource.serverspec_results.order("created_at desc") - - respond_to do |format| - format.json { render json: @serverspec_results.as_json(only: [:id, :status, :message, :created_at], - include: [{serverspec_result_details: {only: [:id]}},{serverspecs: {only:[:name]}}, {resource: {only: [:physical_id]}} ]) } - end - end - - - # TODO: refactor - # POST /serverspecs/run - def run - physical_id = params.require(:physical_id) - infra_id = params.require(:infra_id) - serverspec_ids = params.require(:serverspec_ids) - resource = Resource.where(infrastructure_id: infra_id).find_by(physical_id: physical_id) - if selected_auto_generated = serverspec_ids.include?('-1') - serverspec_ids.delete('-1') - end - - begin - resp = ServerspecJob.perform_now( - physical_id, infra_id, current_user.id, - serverspec_ids: serverspec_ids, auto_generated: selected_auto_generated - ) - rescue => ex - # serverspec が正常に実行されなかったとき - render text: ex.message, status: 500 and return - end - - case resp[:status_text] - when 'success' - render_msg = I18n.t('serverspecs.msg.success', physical_id: physical_id) - when 'pending' - render_msg = I18n.t('serverspecs.msg.pending', physical_id: physical_id, pending_specs: resp[:short_msg]) - when 'failed' - render_msg = I18n.t('serverspecs.msg.failure', physical_id: physical_id, failure_specs: resp[:short_msg]) - end - - ServerspecResult.create( - resource_id: resource.id, - status: resp[:status_text], - message: resp[:message], - serverspec_ids: serverspec_ids - ) - render text: render_msg, status: 200 and return - end - - - # Generate serverspec to connect to RDS instance - # PUT /serverspecs/create_for_rds - def create_for_rds - infra_id = params.require(:infra_id) - physical_id = params.require(:physical_id) - username = params.require(:username) - password = params.require(:password) - database = params[:database] - database = nil if database.blank? - - infra = Infrastructure.find(infra_id) - rds = RDS.new(infra, physical_id) - - Serverspec.create_rds(rds, username, password, infra_id, database) - - render text: I18n.t('serverspecs.msg.generated'), status: 201 and return - end - - # POST /serverspecs/schedule - def schedule - physical_id = params.require(:physical_id) - infra_id = params.require(:infra_id) - schedule = params.require(:schedule).permit(:enabled, :frequency, :day_of_week, :time) - - ss = ServerspecSchedule.find_by(physical_id: physical_id) - ss.update_attributes!(schedule) - - if ss.enabled? - PeriodicServerspecJob.set( - wait_until: ss.next_run - ).perform_later(physical_id, infra_id, current_user.id) - end - - render text: I18n.t('schedules.msg.serverspec_updated'), status: 200 and return - end - - - private - - def set_serverspec - @serverspec = Serverspec.find(params.require(:id)) - end - - def global_serverspec_params - params.require(:serverspec).permit(:name, :description, :value, :infrastructure_id) - end - - def have_infra? - return params[:infra_id] || params[:infrastructure_id] || params[:serverspec][:infrastructure_id] - rescue - return nil - end -end diff --git a/app/controllers/servertests_controller.rb b/app/controllers/servertests_controller.rb new file mode 100644 index 000000000..5db10f305 --- /dev/null +++ b/app/controllers/servertests_controller.rb @@ -0,0 +1,254 @@ +# +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. +# +# This software is released under the MIT License. +# +# http://opensource.org/licenses/mit-license.php +# + +class ServertestsController < ApplicationController + include Concerns::InfraLogger + class ServertestError < ::StandardError; end + + before_action :set_servertest, only: [:update, :show, :edit, :destroy] + + # --------------- Auth + before_action :authenticate_user! + + before_action do + authorize(@serverspec || Servertest.new(infrastructure_id: have_infra?)) + end + + # GET /servertests + def index + @infrastructure_id = params[:infrastructure_id] + page = params[:page] + + @infrastructure_name = Infrastructure.find(@infrastructure_id).stack_name if @infrastructure_id + @servertests = Servertest.where(infrastructure_id: @infrastructure_id).page(page) + + respond_to do |format| + format.json + format.html + end + end + + # GET /servertests/new + def new + infra_id = params[:infrastructure_id] + + @servertest = Servertest.new(infrastructure_id: infra_id) + @servertest.value = %!require 'spec_helper'\n\n! + end + + # GET /servertests/1 + def show + render text: @servertest.value + end + + # POST /servertests/1 + def update + if @servertest.update(global_servertest_params) + redirect_to servertests_path, notice: I18n.t('servertests.msg.updated') + else + flash.now[:alert] = @servertest.errors[:value] if @servertest.errors[:value] + render action: 'edit' + end + end + + # POST /servertests + def create + @servertest = Servertest.new(global_servertest_params) + + infra_id = @servertest.infrastructure_id + + begin + @servertest.save! + rescue => ex + raise ex if ajax? + flash.now[:alert] = @servertest.errors[:value] if @servertest.errors[:value] + render action: 'new', infrastructure_id: infra_id; return + end + + if ajax? + render text: I18n.t('servertests.msg.created') and return + else + redirect_to servertests_path(infrastructure_id: infra_id), + notice: I18n.t('servertests.msg.created') + end + end + + # GET /servertests/1/edit + def edit; end # Rubocop fix + + # GET /servertests/generator + def generator + @infra = Infrastructure.find(params[:infrastructure_id]) if params[:infrastructure_id] + end + + # GET /servertests/awspec_generator + def awspec_generator + @infras = Infrastructure.all + end + + # GET /servertests/generate_awspec + def generate_awspec + @infra = Infrastructure.find(params[:infrastructure_id]) if params[:infrastructure_id] + + ws = WSConnector.new('awspec-generate', @infra.id) + ruby_cmd = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name']) + + cmd = [] + cmd << "AWS_ACCESS_KEY_ID=#{@infra.access_key}" + cmd << "AWS_REGION=#{@infra.region}" + cmd << "AWS_SECRET_ACCESS_KEY=#{@infra.secret_access_key}" + cmd << ruby_cmd << "-S awspec generate ec2 #{@infra.ec2.describe_vpcs[:vpcs][0].vpc_id}" + cmd = cmd.flatten.reject(&:blank?).join(" ") + generated = %!require 'awspec_helper'\n\n! + Thread.new_with_db do + begin + gen, = Node.exec_command(cmd, ServertestError) + generated += gen + ws.push_as_json({status: true, message: I18n.t('zabbix_servers.msg.created'), generated: generated}) + rescue => ex + generated = ex.to_s + ws.push_as_json({status: false, message: ex.message}) + render status: 404 and return + end + end + + render nothing: true, status: 200 and return + end + + # DELETE /servertests/1 + def destroy + infra_id = @servertest.infrastructure_id + @servertest.destroy + + redirect_to servertests_path(infrastructure_id: infra_id), notice: I18n.t('servertests.msg.deleted') + end + + # GET /servertests/select + def select + physical_id = params.require(:physical_id) + infra_id = params.require(:infra_id) + + resource = Resource.where(infrastructure_id: infra_id).find_by(physical_id: physical_id) + @selected_servertest_ids = resource.all_servertest_ids + + servertests = Servertest.for_infra_serverspec(infra_id) + @individual_servertests, @global_servertests = servertests.partition{|spec| spec.infrastructure_id } + node = Node.new(physical_id) + @is_available_auto_generated = node.have_auto_generated + + @servertest_schedule = ServertestSchedule.find_or_create_by(physical_id: physical_id) + end + + # GET /servertests/results + def results + physical_id = params.require(:physical_id) + infra_id = params.require(:infra_id) + resource = Resource.where(infrastructure_id: infra_id).find_by(physical_id: physical_id) + + @servertest_results = resource.servertest_results.order("created_at desc") + + respond_to do |format| + format.json { render json: @servertest_results.as_json(only: [:id, :status, :message, :created_at, :category], + include: [{servertest_result_details: {only: [:id]}},{servertests: {only: [:name, :category]}}, {resource: {only: [:physical_id]}} ]) } + end + end + + + # TODO: refactor + # POST /servertests/run_serverspec + def run_serverspec + physical_id = params.require(:physical_id) + infra_id = params.require(:infra_id) + servertest_ids = params.require(:servertest_ids) + resource = Resource.where(infrastructure_id: infra_id).find_by(physical_id: physical_id) + if selected_auto_generated = servertest_ids.include?('-1') + servertest_ids.delete('-1') + end + + begin + resp = ServertestJob.perform_now( + physical_id, infra_id, current_user.id, + servertest_ids: servertest_ids, auto_generated: selected_auto_generated + ) + rescue => ex + # serverspec が正常に実行されなかったとき + render text: ex.message, status: 500 and return + end + + case resp[:status_text] + when 'success' + render_msg = I18n.t('servertests.msg.success', physical_id: physical_id) + when 'pending' + render_msg = I18n.t('servertests.msg.pending', physical_id: physical_id, pending_specs: resp[:short_msg]) + when 'failed' + render_msg = I18n.t('servertests.msg.failure', physical_id: physical_id, failure_specs: resp[:short_msg]) + end + + ServertestResult.create( + resource_id: resource.id, + status: resp[:status_text], + message: resp[:message], + servertest_ids: servertest_ids + ) + render text: render_msg, status: 200 and return + end + + + # Generate serverspec to connect to RDS instance + # PUT /servertests/create_for_rds + def create_for_rds + infra_id = params.require(:infra_id) + physical_id = params.require(:physical_id) + username = params.require(:username) + password = params.require(:password) + database = params[:database] + database = nil if database.blank? + + infra = Infrastructure.find(infra_id) + rds = RDS.new(infra, physical_id) + + Servertest.create_rds(rds, username, password, infra_id, database) + + render text: I18n.t('servertests.msg.generated'), status: 201 and return + end + + # POST /servertests/schedule + def schedule + physical_id = params.require(:physical_id) + infra_id = params.require(:infra_id) + schedule = params.require(:schedule).permit(:enabled, :frequency, :day_of_week, :time) + + ss = ServertestSchedule.find_by(physical_id: physical_id) + ss.update_attributes!(schedule) + + if ss.enabled? + PeriodicServerspecJob.set( + wait_until: ss.next_run + ).perform_later(physical_id, infra_id, current_user.id) + end + + render text: I18n.t('schedules.msg.serverspec_updated'), status: 200 and return + end + + + private + + def set_servertest + @servertest = Servertest.find(params.require(:id)) + end + + def global_servertest_params + params.require(:servertest).permit(:name, :description, :value, :infrastructure_id, :category) + end + + def have_infra? + return params[:infra_id] || params[:infrastructure_id] || params[:serverspec][:infrastructure_id] + rescue + return nil + end +end diff --git a/app/controllers/snapshots_controller.rb b/app/controllers/snapshots_controller.rb index 81e3c9c9f..4073f17e2 100644 --- a/app/controllers/snapshots_controller.rb +++ b/app/controllers/snapshots_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/template_builder_controller.rb b/app/controllers/template_builder_controller.rb index bdfbe6b25..f7ab16b77 100644 --- a/app/controllers/template_builder_controller.rb +++ b/app/controllers/template_builder_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/users/sessions_controller.rb b/app/controllers/users/sessions_controller.rb index aa3d932c5..dba75e655 100644 --- a/app/controllers/users/sessions_controller.rb +++ b/app/controllers/users/sessions_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/controllers/users_admin_controller.rb b/app/controllers/users_admin_controller.rb index 6190ca8d1..f45724dc7 100644 --- a/app/controllers/users_admin_controller.rb +++ b/app/controllers/users_admin_controller.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index fd9a29fee..bf26c8fd2 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -29,6 +29,10 @@ def gravatar(email) def bootstrap_flash(options = {}) flash_messages = [] + if Rails.cache.exist?(:err) + flash[:danger] = Rails.cache.read(:err) + Rails.cache.delete(:err) + end flash.each do |type, message| # Skip empty messages, e.g. for devise messages set to nothing in a locale file. next if message.blank? diff --git a/app/helpers/cf_templates_helper.rb b/app/helpers/cf_templates_helper.rb index e62b38688..a6b86facd 100644 --- a/app/helpers/cf_templates_helper.rb +++ b/app/helpers/cf_templates_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/clients_helper.rb b/app/helpers/clients_helper.rb index 23938b4e9..fe02c149a 100644 --- a/app/helpers/clients_helper.rb +++ b/app/helpers/clients_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/deploy_wizard_helper.rb b/app/helpers/deploy_wizard_helper.rb index 484726a1c..c6ea19a32 100644 --- a/app/helpers/deploy_wizard_helper.rb +++ b/app/helpers/deploy_wizard_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/dishes_helper.rb b/app/helpers/dishes_helper.rb index a3e7b0d96..fa8e63f72 100644 --- a/app/helpers/dishes_helper.rb +++ b/app/helpers/dishes_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/form_helper.rb b/app/helpers/form_helper.rb index 7f239e565..1c1855d48 100644 --- a/app/helpers/form_helper.rb +++ b/app/helpers/form_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/infrastructures_helper.rb b/app/helpers/infrastructures_helper.rb index 9ca31da32..a4667254f 100644 --- a/app/helpers/infrastructures_helper.rb +++ b/app/helpers/infrastructures_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/monitorings_helper.rb b/app/helpers/monitorings_helper.rb index 83c0c33cb..fb402820c 100644 --- a/app/helpers/monitorings_helper.rb +++ b/app/helpers/monitorings_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/nodes_helper.rb b/app/helpers/nodes_helper.rb index c6dd7f3b4..625c298e3 100644 --- a/app/helpers/nodes_helper.rb +++ b/app/helpers/nodes_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb index 736d26f6f..e3fab9aa0 100644 --- a/app/helpers/notifications_helper.rb +++ b/app/helpers/notifications_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 1985762e8..4ec03e6fb 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/template_builders_helper.rb b/app/helpers/template_builders_helper.rb index b9e503bce..16c5eae68 100644 --- a/app/helpers/template_builders_helper.rb +++ b/app/helpers/template_builders_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 451210788..c1b8bcc11 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/helpers/vue_helper.rb b/app/helpers/vue_helper.rb index 3f60d537c..75ba393b8 100644 --- a/app/helpers/vue_helper.rb +++ b/app/helpers/vue_helper.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/jobs/delete_outdated_snapshots_job.rb b/app/jobs/delete_outdated_snapshots_job.rb index 421b1897b..3dc13e0e1 100644 --- a/app/jobs/delete_outdated_snapshots_job.rb +++ b/app/jobs/delete_outdated_snapshots_job.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/jobs/operation_worker.rb b/app/jobs/operation_worker.rb index da1a2c7f6..b17609ec9 100644 --- a/app/jobs/operation_worker.rb +++ b/app/jobs/operation_worker.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/jobs/periodic_serverspec_job.rb b/app/jobs/periodic_serverspec_job.rb index 7011096cf..5c9d1dbde 100644 --- a/app/jobs/periodic_serverspec_job.rb +++ b/app/jobs/periodic_serverspec_job.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/jobs/periodic_yum_job.rb b/app/jobs/periodic_yum_job.rb index 0ffa3d8c7..978feb6ba 100644 --- a/app/jobs/periodic_yum_job.rb +++ b/app/jobs/periodic_yum_job.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/jobs/reload_secrets_job.rb b/app/jobs/reload_secrets_job.rb new file mode 100644 index 000000000..a24f89b03 --- /dev/null +++ b/app/jobs/reload_secrets_job.rb @@ -0,0 +1,18 @@ +# +# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# +# This software is released under the MIT License. +# +# http://opensource.org/licenses/mit-license.php +# + +class ReloadSecretsJob < ActiveJob::Base + queue_as :default + + # Ref: https://github.com/rails/rails/blob/634741d9721eb938c8bce38c109023178268e43d/railties/lib/rails/application.rb#L385 + def perform + Rails.application.remove_instance_variable(:@secrets) + ensure + Rails.application.secrets + end +end diff --git a/app/jobs/server_state_worker.rb b/app/jobs/server_state_worker.rb index f544163c5..f709929aa 100644 --- a/app/jobs/server_state_worker.rb +++ b/app/jobs/server_state_worker.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/jobs/serverspec_job.rb b/app/jobs/servertest_job.rb similarity index 70% rename from app/jobs/serverspec_job.rb rename to app/jobs/servertest_job.rb index 2d2dd3667..0ab6312e2 100644 --- a/app/jobs/serverspec_job.rb +++ b/app/jobs/servertest_job.rb @@ -1,12 +1,12 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # # http://opensource.org/licenses/mit-license.php # -class ServerspecJob < ActiveJob::Base +class ServertestJob < ActiveJob::Base queue_as :default # Serverspec を実行し、結果をインフラログに書き出す。 @@ -14,26 +14,30 @@ class ServerspecJob < ActiveJob::Base # @param [String] physical_id ID of EC2 Instance # @param [Integer] infra_id # @param [Integer] user_id このユーザーで Serverspec が実行される - # @param [Array] serverspec_ids 指定されていなければ、Resource に紐付いた Serverspec を実行する。 + # @param [Array] servertest_ids 指定されていなければ、Resource に紐付いた Serverspec を実行する。 # 指定されていれば、指定した Serverspec を実行する。 # @param [Boolean] auto_generated - def perform(physical_id, infra_id, user_id, serverspec_ids: nil, auto_generated: false) + def perform(physical_id, infra_id, user_id, servertest_ids: nil, auto_generated: false, category: nil) node = Node.new(physical_id) - unless serverspec_ids + unless servertest_ids infra = Infrastructure.find(infra_id) resource = infra.resource(physical_id) - serverspec_ids = resource.all_serverspec_ids + servertest_ids = resource.all_servertest_ids end @ws = WSConnector.new('notifications', User.find(user_id).ws_key) - infra_logger_serverspec_start(physical_id, infra_id, user_id, auto_generated, serverspec_ids) + infra_logger_serverspec_start(physical_id, infra_id, user_id, auto_generated, servertest_ids) begin - resp = node.run_serverspec(infra_id, serverspec_ids, auto_generated) + resp = if category.nil? + node.run_serverspec(infra_id, servertest_ids, auto_generated) + else + node.run_awsspec(infra_id, servertest_ids, auto_generated) + end rescue => ex log = InfrastructureLog.create( infrastructure_id: infra_id, user_id: user_id, status: false, - details: "serverspec for #{physical_id} is failed. results: \n#{ex.message}" + details: "servertest for #{physical_id} is failed. results: \n#{ex.message}" ) @ws.push_as_json({message: log.details, status: log.status, timestamp: Time.zone.now.to_s}) raise ex @@ -41,21 +45,21 @@ def perform(physical_id, infra_id, user_id, serverspec_ids: nil, auto_generated: case resp[:status_text] when 'success' - log_msg = "serverspec for #{physical_id} is successfully finished." + log_msg = "servertest for #{physical_id} is successfully finished." when 'pending' - log_msg = "serverspec for #{physical_id} is successfully finished. but have pending specs: \n#{resp[:message]}" + log_msg = "servertest for #{physical_id} is successfully finished. but have pending specs: \n#{resp[:message]}" when 'failed' - log_msg = "serverspec for #{physical_id} is failed. failure specs: \n#{resp[:message]}" + log_msg = "servertest for #{physical_id} is failed. failure specs: \n#{resp[:message]}" end log = InfrastructureLog.create(infrastructure_id: infra_id, user_id: user_id, details: log_msg, status: resp[:status]) @ws.push_as_json({message: log.details, status: log.status, timestamp: Time.zone.now.to_s}) - Resource.where(infrastructure_id: infra_id).find_by(physical_id: physical_id).serverspec_ids = serverspec_ids + Resource.where(infrastructure_id: infra_id).find_by(physical_id: physical_id).servertest_ids = servertest_ids return resp end - def infra_logger_serverspec_start(physical_id, infra_id, user_id, auto_generated, serverspec_ids) - selected_serverspecs = Serverspec.where(id: serverspec_ids) + def infra_logger_serverspec_start(physical_id, infra_id, user_id, auto_generated, servertest_ids) + selected_serverspecs = Servertest.where(id: servertest_ids, category: 1) serverspec_names = [] serverspec_names << 'auto_generated' if auto_generated diff --git a/app/jobs/snapshot_job.rb b/app/jobs/snapshot_job.rb index 2dc05bc49..b1c88912f 100644 --- a/app/jobs/snapshot_job.rb +++ b/app/jobs/snapshot_job.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/jobs/yum_job.rb b/app/jobs/yum_job.rb index f94d253ab..c4d0055e3 100644 --- a/app/jobs/yum_job.rb +++ b/app/jobs/yum_job.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/app_setting.rb b/app/models/app_setting.rb index 80965e204..6beae0d54 100644 --- a/app/models/app_setting.rb +++ b/app/models/app_setting.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -40,7 +40,7 @@ def clear_dummy # AppSetting.get 用のキャッシュを削除する。 # 設定を更新した場合などにする必要がある def clear_cache - Rails.cache.clear('app_setting') + Rails.cache.delete('app_setting') end def ec2_client(access_key, secret_access_key, region) diff --git a/app/models/cf_template.rb b/app/models/cf_template.rb index a9fb4b30c..a8f3c87ea 100644 --- a/app/models/cf_template.rb +++ b/app/models/cf_template.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/chef_api.rb b/app/models/chef_api.rb index 5e1c667d7..63dcc25c0 100644 --- a/app/models/chef_api.rb +++ b/app/models/chef_api.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -19,7 +19,10 @@ class CookbookNotFound < NotFound; end # TODO: Rails server をリスタートする必要がある def setup - @@ridley = ::Ridley.from_chef_config(File.expand_path("~/.chef/knife.rb")) + options = { + ssl: {verify: false} # disable SSL verification + } + @@ridley = ::Ridley.from_chef_config(File.expand_path("~/.chef/knife.rb"), options) rescue => ex Rails.logger.warn(ex) end diff --git a/app/models/chef_server/deployment.rb b/app/models/chef_server/deployment.rb index ff648aa66..0cc881777 100644 --- a/app/models/chef_server/deployment.rb +++ b/app/models/chef_server/deployment.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -39,7 +39,7 @@ class Error < StandardError; end class << self # chef_serverを作成し、自身のインスタンスを返す。 # blockが与えられていれば、そのブロックに進捗状況を渡して実行する。 - def create(stack_name, region, keypair_name, keypair_value, &block) + def create(stack_name, region, keypair_name, keypair_value, params = {}, &block) __yield :creating_infra, &block prj = Project.for_chef_server @@ -55,12 +55,14 @@ def create(stack_name, region, keypair_name, keypair_value, &block) region: region ) - stack = create_stack(infra, 'Chef Server', params: { + params.merge!( InstanceType: 't2.small', UserPemID: UserPemID, OrgPemID: OrgPemID, TrustedCertsPemID: TrustedCertsPemID, - }) + ) + + stack = create_stack(infra, 'Chef Server', params: params) __yield :init_ec2, &block stack.wait_resource_status('EC2Instance', 'CREATE_COMPLETE') @@ -88,7 +90,7 @@ def create(stack_name, region, keypair_name, keypair_value, &block) # XXX: こぴぺをやめてここじゃないとこにちゃんと定義する - def create_zabbix(stack_name, region, keypair_name, keypair_value) + def create_zabbix(stack_name, region, keypair_name, keypair_value, params = {}) prj = Project.for_zabbix_server infra = Infrastructure.create_with_ec2_private_key( project: prj, @@ -98,7 +100,7 @@ def create_zabbix(stack_name, region, keypair_name, keypair_value) region: region ) template = ERB::Builder.new('zabbix_server').build - stack = create_stack(infra, 'Zabbix Server', template: template) + stack = create_stack(infra, 'Zabbix Server', params: params, template: template) wait_creation(stack) physical_id = stack.instances.first.physical_resource_id diff --git a/app/models/client.rb b/app/models/client.rb index c2470aeb0..d34536bc5 100644 --- a/app/models/client.rb +++ b/app/models/client.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/cloud_provider.rb b/app/models/cloud_provider.rb index 3e6ec09a9..4442b463b 100644 --- a/app/models/cloud_provider.rb +++ b/app/models/cloud_provider.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/cloud_watch.rb b/app/models/cloud_watch.rb index 698989691..c0f2c1eb8 100644 --- a/app/models/cloud_watch.rb +++ b/app/models/cloud_watch.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/concerns/cryptize.rb b/app/models/concerns/cryptize.rb index 614640141..fa29a639b 100644 --- a/app/models/concerns/cryptize.rb +++ b/app/models/concerns/cryptize.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -10,15 +10,16 @@ module Concerns::Cryptize # @param [Symbol] name is an attributes name. def cryptize(name) - c = crypter + # XXX: secrets を変更したときに正しく (en|de)crypt できる? + crypter = method(:crypter) define_method(:"#{name}=") do |v| - val = v.nil? ? v : c.encrypt_and_sign(v) + val = v.nil? ? v : crypter.call.encrypt_and_sign(v) self[name] = val end define_method(name) do v = self[name] - v.nil? ? v : c.decrypt_and_verify(v) + v.nil? ? v : crypter.call.decrypt_and_verify(v) end end diff --git a/app/models/database_manager.rb b/app/models/database_manager.rb new file mode 100644 index 000000000..ec7665e82 --- /dev/null +++ b/app/models/database_manager.rb @@ -0,0 +1,81 @@ +# +# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# +# This software is released under the MIT License. +# +# http://opensource.org/licenses/mit-license.php +# + +class DatabaseManager + SQLPATH = 'tmp/import.sql'.freeze + SECRETS = [:secret_key_base, :db_crypt_key].freeze + SUFFIX = { + 'development' => 'dev', + 'test' => 'test', + 'production' => 'prod', + }.freeze + + class << self + def export_as_zip + dbname = ActiveRecord::Base.configurations[Rails.env]['database'] + filename = "#{dbname}.sql" + path = Rails.root.join("tmp/#{filename}") + + system('rake db:data:dump') + + zipfile = Tempfile.open("skyhopper") + ::Zip::File.open(zipfile.path, ::Zip::File::CREATE) do |zip| + zip.add(filename, path) + + Rails.application.secrets.each do |key, value| + next if value.nil? + zip.get_output_stream(key) { |io| io.write(value) } + end + end + + FileUtils.rm(path) + + zipfile + end + + def import(sqlpath, secrets) + env = SUFFIX[Rails.env] + secrets.each do |key, value| + path = Rails.root.join('secrets', "#{key}-#{env}") + File.write(path, value) + end + + ReloadSecretsJob.perform_now # runs in Rails process + ReloadSecretsJob.perform_later # runs in Sidekiq process + + system("rake db:data:load[#{sqlpath}]") + Rails.cache.clear + end + + + def import_from_zip(path) + zip = ::Zip::File.open(path) + validate_zip!(zip) + + FileUtils.rm(SQLPATH) if File.exist?(SQLPATH) + zip.glob('*.sql').first.extract(SQLPATH) + secrets = SECRETS.map { |name| [name, zip.read(name)] }.to_h + zip.close + + import(SQLPATH, secrets) + end + + def validate_zip_file!(path) + zip = ::Zip::File.open(path) + validate_zip!(zip) + end + + private + def validate_zip!(zip) + SECRETS.each do |filename| + raise "#{filename} is not found in zip." unless zip.find_entry(filename) + end + raise 'SQL file is not found in zip.' if zip.glob('*.sql').empty? + end + end +end diff --git a/app/models/dish.rb b/app/models/dish.rb index 7d58abc38..61cf50aea 100644 --- a/app/models/dish.rb +++ b/app/models/dish.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -9,8 +9,8 @@ class Dish < ActiveRecord::Base belongs_to :project has_many :resources - has_many :dish_serverspecs - has_many :serverspecs, through: :dish_serverspecs + has_many :dish_servertests + has_many :servertests, through: :dish_servertests serialize :runlist diff --git a/app/models/dish_serverspec.rb b/app/models/dish_servertest.rb similarity index 53% rename from app/models/dish_serverspec.rb rename to app/models/dish_servertest.rb index 99e607259..7338cd525 100644 --- a/app/models/dish_serverspec.rb +++ b/app/models/dish_servertest.rb @@ -1,12 +1,12 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # # http://opensource.org/licenses/mit-license.php # -class DishServerspec < ActiveRecord::Base +class DishServertest < ActiveRecord::Base belongs_to :dish, dependent: :destroy - belongs_to :serverspec, dependent: :destroy + belongs_to :servertest, dependent: :destroy end diff --git a/app/models/ec2_instance.rb b/app/models/ec2_instance.rb index 558b8482c..ff1d9d0b9 100644 --- a/app/models/ec2_instance.rb +++ b/app/models/ec2_instance.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/ec2_private_key.rb b/app/models/ec2_private_key.rb index 995d473e0..83439df0d 100644 --- a/app/models/ec2_private_key.rb +++ b/app/models/ec2_private_key.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/elb.rb b/app/models/elb.rb index 242595aac..8f6aa2172 100644 --- a/app/models/elb.rb +++ b/app/models/elb.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/infrastructure.rb b/app/models/infrastructure.rb index 81a875d9e..d42c5bec2 100644 --- a/app/models/infrastructure.rb +++ b/app/models/infrastructure.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -14,7 +14,7 @@ class Infrastructure < ActiveRecord::Base belongs_to :ec2_private_key, dependent: :delete has_many :infrastructure_logs, dependent: :delete_all - has_many :serverspecs, dependent: :delete_all + has_many :servertests, dependent: :delete_all has_many :resources, dependent: :destroy has_many :monitorings, dependent: :delete_all has_many :master_monitorings, through: :monitorings diff --git a/app/models/infrastructure_log.rb b/app/models/infrastructure_log.rb index fc221dcc4..f7bf5912f 100644 --- a/app/models/infrastructure_log.rb +++ b/app/models/infrastructure_log.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/key_pair.rb b/app/models/key_pair.rb index 778ed440d..b8e144c4a 100644 --- a/app/models/key_pair.rb +++ b/app/models/key_pair.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/maintenance_mode.rb b/app/models/maintenance_mode.rb new file mode 100644 index 000000000..9b0ab5d51 --- /dev/null +++ b/app/models/maintenance_mode.rb @@ -0,0 +1,24 @@ +# +# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# +# This software is released under the MIT License. +# +# http://opensource.org/licenses/mit-license.php +# + +module MaintenanceMode + module_function + + def activate(settings = nil) + maint_file = Turnout::MaintenanceFile.default + maint_file.import(settings.stringify_keys) if settings.is_a?(Hash) + maint_file.write + Rails.logger.info("Maintenance mode has activated.\nReason: \"#{maint_file.reason}\"") + end + + def deactivate + Turnout::MaintenanceFile.default.delete + Rails.logger.info('Maintenance mode has deactivated.') + end + +end diff --git a/app/models/master_monitoring.rb b/app/models/master_monitoring.rb index a1d1ff9c6..81fd1ad3b 100644 --- a/app/models/master_monitoring.rb +++ b/app/models/master_monitoring.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/monitoring.rb b/app/models/monitoring.rb index 652718b16..2300be457 100644 --- a/app/models/monitoring.rb +++ b/app/models/monitoring.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/node.rb b/app/models/node.rb index d84b3b032..143c94e90 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -150,13 +150,13 @@ def have_roles?(roles) end # serverspec_ids => ServerspecのidのArray - def run_serverspec(infra_id, serverspec_ids, selected_auto_generated) + def run_serverspec(infra_id, servertest_ids, selected_auto_generated) # get params infra = Infrastructure.find(infra_id) ec2key = infra.ec2_private_key ec2key.output_temp(prefix: @name) - raise ServerspecError, 'specs is empty' if serverspec_ids.empty? and ! selected_auto_generated + raise ServerspecError, 'specs is empty' if servertest_ids.empty? and ! selected_auto_generated fqdn = infra.instance(@name).fqdn @@ -164,8 +164,8 @@ def run_serverspec(infra_id, serverspec_ids, selected_auto_generated) local_path = scp_specs(ec2key.path_temp, fqdn) end - run_spec_list_path = serverspec_ids.map do |spec| - ::Serverspec.to_file(spec) + run_spec_list_path = servertest_ids.map do |spec| + ::Servertest.to_file(spec) end ruby_cmd = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name']) @@ -187,36 +187,12 @@ def run_serverspec(infra_id, serverspec_ids, selected_auto_generated) end # create result - result = JSON::parse(out, symbolize_names: true) - result[:examples].each do |e| - e[:exception].delete(:backtrace) if e[:exception] - end - result[:status] = result[:summary][:failure_count].zero? - result[:status_text] = - if result[:status] - if result[:summary][:pending_count].zero? - 'success' - else - 'pending' - end - else - 'failed' - end - + result = generate_result(out) + Resource.find_by(physical_id: @name).status.servertest.update(value: result[:status_text]) - case result[:status_text] - when 'pending' - result[:message] = result[:examples].select{|x| x[:status] == 'pending'}.map{|x| x[:full_description]+"\n"+x[:command]+"\n"+x[:exception][:message]}.join("\n") - result[:short_msg] = result[:examples].select{|x| x[:status] == 'failed'},map{|x| x[:full_description]}.join("\n") - when 'failed' - result[:message] = result[:examples].select{|x| x[:status] == 'failed'}.map{|x| x[:full_description]+"\n"+x[:command]+"\n"+x[:exception][:message]}.join("\n") - result[:short_msg] = result[:examples].select{|x| x[:status] == 'failed'}.map{|x| x[:full_description]}.join("\n") - end - - Resource.find_by(physical_id: @name).status.serverspec.update(value: result[:status_text]) return result rescue => ex - Resource.find_by(physical_id: @name).status.serverspec.failed! + Resource.find_by(physical_id: @name).status.servertest.failed! raise ex ensure ec2key.close_temp @@ -273,8 +249,8 @@ def scp_specs(sshkey_path, fqdn) d['default']['serverspec-handler']['output_dir'] end - Dir::mkdir(Serverspec::TmpDir) unless Dir::exist?(Serverspec::TmpDir) - local_path = Dir::mktmpdir(nil, Serverspec::TmpDir) + Dir::mkdir(Servertest::TmpDir) unless Dir::exist?(Servertest::TmpDir) + local_path = Dir::mktmpdir(nil, Servertest::TmpDir) Net::SCP.start(fqdn, @user, keys: sshkey_path) do |scp| scp.download!(remote_path, local_path, recursive: true) @@ -312,7 +288,6 @@ def exec_knife_ssh(command, infra) Open3.popen3(cmd) do |_stdin, stdout, stderr, w| while line = stdout.gets - line.gsub!(/\x1b[^m]*m/, '') # remove ANSI escape line.chomp! yield line @@ -337,7 +312,6 @@ def exec_knife_winrm(command, infra) Open3.popen3(cmd) do |_stdin, stdout, stderr, w| while line = stdout.gets - line.gsub!(/\x1b[^m]*m/, '') # remove ANSI escape line.chomp! yield line @@ -352,5 +326,35 @@ def exec_knife_winrm(command, infra) # ec2key.close_temp end + def generate_result(out) + result = JSON::parse(out, symbolize_names: true) + result[:examples].each do |e| + e[:exception].delete(:backtrace) if e[:exception] + end + result[:status] = result[:summary][:failure_count].zero? + result[:status_text] = + if result[:status] + if result[:summary][:pending_count].zero? + 'success' + else + 'pending' + end + else + 'failed' + end + + + case result[:status_text] + when 'pending' + result[:message] = result[:examples].select{|x| x[:status] == 'pending'}.map{|x| x[:full_description]+"\n"+x[:command]+"\n"+x[:exception][:message]}.join("\n") + result[:short_msg] = result[:examples].select{|x| x[:status] == 'failed'},map{|x| x[:full_description]}.join("\n") + when 'failed' + result[:message] = result[:examples].select{|x| x[:status] == 'failed'}.map{|x| x[:full_description]+"\n"+x[:command]+"\n"+x[:exception][:message]}.join("\n") + result[:short_msg] = result[:examples].select{|x| x[:status] == 'failed'}.map{|x| x[:full_description]}.join("\n") + end + + return result + end + end diff --git a/app/models/node/attribute.rb b/app/models/node/attribute.rb index f87fcd30a..a61950615 100644 --- a/app/models/node/attribute.rb +++ b/app/models/node/attribute.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/operation_duration.rb b/app/models/operation_duration.rb index 398146366..470c5323f 100644 --- a/app/models/operation_duration.rb +++ b/app/models/operation_duration.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/project.rb b/app/models/project.rb index e68b01641..deb6e229c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/project_parameter.rb b/app/models/project_parameter.rb index c8596eb82..bfa52635c 100644 --- a/app/models/project_parameter.rb +++ b/app/models/project_parameter.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/rds.rb b/app/models/rds.rb index 1d70da516..99482af9c 100644 --- a/app/models/rds.rb +++ b/app/models/rds.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/recurring_date.rb b/app/models/recurring_date.rb index af5001b6c..2f0a161b7 100644 --- a/app/models/recurring_date.rb +++ b/app/models/recurring_date.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/resource.rb b/app/models/resource.rb index bd730b416..933d56ce0 100644 --- a/app/models/resource.rb +++ b/app/models/resource.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -10,13 +10,13 @@ class Resource < ActiveRecord::Base belongs_to :infrastructure belongs_to :dish - has_many :resource_serverspecs - has_many :serverspecs, through: :resource_serverspecs + has_many :resource_servertests + has_many :servertests, through: :resource_servertests has_many :status, dependent: :delete_all, class_name: 'ResourceStatus' - has_many :serverspec_results + has_many :servertest_results has_many :operation_durations - has_one :serverspec_schedule, dependent: :destroy, foreign_key: 'physical_id', primary_key: 'physical_id' + has_one :servertest_schedule, dependent: :destroy, foreign_key: 'physical_id', primary_key: 'physical_id' validates :physical_id, uniqueness: true @@ -30,13 +30,13 @@ class Resource < ActiveRecord::Base # 自身の持つ Serverpsec と、自身が持つ Dish に紐づく Serverspec の和集合を返す。 # @XXX ActiveRecord::Relation を返したい。だけど arel の union が relation を返してくれなくてうまくいかない。 # @return [Array] - def all_serverspecs - self.serverspecs | (self.dish.try(:serverspecs) || []) + def all_servertests + self.servertests | (self.dish.try(:servertests) || []) end # XXX: パフォーマンスがきになる. all_serverspecs のほうが relation を返せば pluck が使える - def all_serverspec_ids - all_serverspecs.map{|x|x.id} + def all_servertest_ids + all_servertests.map{|x|x.id} end def initialize_statuses @@ -52,9 +52,10 @@ def detach_chef end def detach_zabbix - s = AppSetting.get + z = ZabbixServer.find(self.infrastructure.project.zabbix_server_id) + begin - z = Zabbix.new(s.zabbix_user, s.zabbix_pass) + z = Zabbix.new(z.fqdn, z.username, z.password) z.delete_hosts_by_resource(self.physical_id) rescue => ex return self if ex.message.include("physical id not found.") diff --git a/app/models/resource_serverspec.rb b/app/models/resource_servertest.rb similarity index 53% rename from app/models/resource_serverspec.rb rename to app/models/resource_servertest.rb index 7e561a416..e94bfd6b1 100644 --- a/app/models/resource_serverspec.rb +++ b/app/models/resource_servertest.rb @@ -1,12 +1,12 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # # http://opensource.org/licenses/mit-license.php # -class ResourceServerspec < ActiveRecord::Base +class ResourceServertest < ActiveRecord::Base belongs_to :resource, dependent: :destroy - belongs_to :serverspec, dependent: :destroy + belongs_to :servertest, dependent: :destroy end diff --git a/app/models/resource_status.rb b/app/models/resource_status.rb index bc2c8124f..0b96bd513 100644 --- a/app/models/resource_status.rb +++ b/app/models/resource_status.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -10,7 +10,7 @@ class ResourceStatus < ActiveRecord::Base belongs_to :resource enum value: %i(success failed pending un_executed inprogress) - enum kind: %i(serverspec cook yum) + enum kind: %i(servertest cook yum) kinds.each do |k, v| scope k, -> { find_by(kind: v) } diff --git a/app/models/s3.rb b/app/models/s3.rb index c48b300a4..e42d92cf8 100644 --- a/app/models/s3.rb +++ b/app/models/s3.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -18,7 +18,8 @@ def initialize(infra, bucket_name) @s3 = ::AWS::S3.new( access_key_id: access_key_id, - secret_access_key: secret_access_key + secret_access_key: secret_access_key, + s3_endpoint: "s3-#{@region}.amazonaws.com" ) @s3_bucket = @s3.buckets[bucket_name] diff --git a/app/models/schedule.rb b/app/models/schedule.rb index 29d8cf52b..a63cf115c 100644 --- a/app/models/schedule.rb +++ b/app/models/schedule.rb @@ -1,13 +1,11 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # # http://opensource.org/licenses/mit-license.php # -require 'sidekiq/api' - class Schedule < ActiveRecord::Base enum frequency: %i[daily weekly intervals] enum day_of_week: %i[sunday monday tuesday wednesday thursday friday saturday] diff --git a/app/models/server_state.rb b/app/models/server_state.rb index 6be190a59..2929383a1 100644 --- a/app/models/server_state.rb +++ b/app/models/server_state.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/serverspec_result.rb b/app/models/serverspec_result.rb deleted file mode 100644 index 987efa5b4..000000000 --- a/app/models/serverspec_result.rb +++ /dev/null @@ -1,14 +0,0 @@ -# -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. -# -# This software is released under the MIT License. -# -# http://opensource.org/licenses/mit-license.php -# - -class ServerspecResult < ActiveRecord::Base - belongs_to :resource - has_many :serverspec_result_details - has_many :serverspecs, through: :serverspec_result_details - enum status: [:success, :pending, :failed] -end diff --git a/app/models/serverspec_result_detail.rb b/app/models/serverspec_result_detail.rb deleted file mode 100644 index 8403a5223..000000000 --- a/app/models/serverspec_result_detail.rb +++ /dev/null @@ -1,12 +0,0 @@ -# -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. -# -# This software is released under the MIT License. -# -# http://opensource.org/licenses/mit-license.php -# - -class ServerspecResultDetail < ActiveRecord::Base - belongs_to :serverspec - belongs_to :serverspec_result -end diff --git a/app/models/serverspec.rb b/app/models/servertest.rb similarity index 75% rename from app/models/serverspec.rb rename to app/models/servertest.rb index 8e65ed66b..3942eeccf 100644 --- a/app/models/serverspec.rb +++ b/app/models/servertest.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # @@ -8,14 +8,15 @@ require 'fileutils' -class Serverspec < ActiveRecord::Base +class Servertest < ActiveRecord::Base belongs_to :infrastructure - has_many :dish_serverspecs - has_many :dishes, through: :dish_serverspecs - has_many :resource_serverspecs - has_many :resources, through: :resource_serverspecs - has_many :serverspec_results, through: :serverspec_result_details + has_many :dish_servertests + has_many :dishes, through: :dish_servertests + has_many :resource_servertests + has_many :resources, through: :resource_servertests + has_many :servertest_results, through: :servertest_result_details + enum category: [:awspec, :serverspec] validates :value, ruby: true @@ -31,6 +32,10 @@ def for_infra(infrastructure_id) where(infrastructure_id: [nil, infrastructure_id]).to_a end + def for_infra_serverspec(infrastructure_id) + where(infrastructure_id: [nil, infrastructure_id], category: 1).to_a + end + def global where(infrastructure_id: nil) end diff --git a/app/models/servertest_result.rb b/app/models/servertest_result.rb new file mode 100644 index 000000000..a599dc91b --- /dev/null +++ b/app/models/servertest_result.rb @@ -0,0 +1,14 @@ +# +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. +# +# This software is released under the MIT License. +# +# http://opensource.org/licenses/mit-license.php +# + +class ServertestResult < ActiveRecord::Base + belongs_to :resource + has_many :servertest_result_details + has_many :servertests, through: :servertest_result_details + enum status: [:success, :pending, :failed] +end diff --git a/app/models/servertest_result_detail.rb b/app/models/servertest_result_detail.rb new file mode 100644 index 000000000..55d7ba1b4 --- /dev/null +++ b/app/models/servertest_result_detail.rb @@ -0,0 +1,12 @@ +# +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. +# +# This software is released under the MIT License. +# +# http://opensource.org/licenses/mit-license.php +# + +class ServertestResultDetail < ActiveRecord::Base + belongs_to :servertest + belongs_to :servertest_result +end diff --git a/app/models/serverspec_schedule.rb b/app/models/servertest_schedule.rb similarity index 86% rename from app/models/serverspec_schedule.rb rename to app/models/servertest_schedule.rb index 0a915308e..3d9db9283 100644 --- a/app/models/serverspec_schedule.rb +++ b/app/models/servertest_schedule.rb @@ -1,12 +1,12 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # # http://opensource.org/licenses/mit-license.php # -class ServerspecSchedule < Schedule +class ServertestSchedule < Schedule belongs_to :resource, foreign_key: 'physical_id', primary_key: 'physical_id' before_update :delete_enqueued_jobs diff --git a/app/models/snapshot.rb b/app/models/snapshot.rb index b09549fc4..0822900d2 100644 --- a/app/models/snapshot.rb +++ b/app/models/snapshot.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/snapshot_schedule.rb b/app/models/snapshot_schedule.rb index d77aa01f6..820b05dd8 100644 --- a/app/models/snapshot_schedule.rb +++ b/app/models/snapshot_schedule.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/stack.rb b/app/models/stack.rb index a7175b422..a55c3a436 100644 --- a/app/models/stack.rb +++ b/app/models/stack.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder.rb b/app/models/template_builder.rb index dde889cd2..98152db59 100644 --- a/app/models/template_builder.rb +++ b/app/models/template_builder.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/output.rb b/app/models/template_builder/output.rb index 4b8380bf7..c6c2fbbf1 100644 --- a/app/models/template_builder/output.rb +++ b/app/models/template_builder/output.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/parameter.rb b/app/models/template_builder/parameter.rb index be1a985b2..e9f2365c6 100644 --- a/app/models/template_builder/parameter.rb +++ b/app/models/template_builder/parameter.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/property.rb b/app/models/template_builder/property.rb index 4cfa320fe..3c956da63 100644 --- a/app/models/template_builder/property.rb +++ b/app/models/template_builder/property.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/resource.rb b/app/models/template_builder/resource.rb index 0ccd2bf57..3aef94ce7 100644 --- a/app/models/template_builder/resource.rb +++ b/app/models/template_builder/resource.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/resource/ec2.rb b/app/models/template_builder/resource/ec2.rb index 8d58805b2..985565f2d 100644 --- a/app/models/template_builder/resource/ec2.rb +++ b/app/models/template_builder/resource/ec2.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/resource/ec2/eip.rb b/app/models/template_builder/resource/ec2/eip.rb index f173b9902..466167318 100644 --- a/app/models/template_builder/resource/ec2/eip.rb +++ b/app/models/template_builder/resource/ec2/eip.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/resource/ec2/instance.rb b/app/models/template_builder/resource/ec2/instance.rb index 7733b125a..2b4e60618 100644 --- a/app/models/template_builder/resource/ec2/instance.rb +++ b/app/models/template_builder/resource/ec2/instance.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/resource/ec2/security_group.rb b/app/models/template_builder/resource/ec2/security_group.rb index a0bb69c9b..68690e0d3 100644 --- a/app/models/template_builder/resource/ec2/security_group.rb +++ b/app/models/template_builder/resource/ec2/security_group.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/resource/ec2/vpc.rb b/app/models/template_builder/resource/ec2/vpc.rb index ae1a7abf3..55b7ee0e2 100644 --- a/app/models/template_builder/resource/ec2/vpc.rb +++ b/app/models/template_builder/resource/ec2/vpc.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/resource/rds.rb b/app/models/template_builder/resource/rds.rb index 194c027de..d45b8fb08 100644 --- a/app/models/template_builder/resource/rds.rb +++ b/app/models/template_builder/resource/rds.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/resource/rds/db_instance.rb b/app/models/template_builder/resource/rds/db_instance.rb index 6f6510516..ecce7353c 100644 --- a/app/models/template_builder/resource/rds/db_instance.rb +++ b/app/models/template_builder/resource/rds/db_instance.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/template_builder/resource/s3/bucket.rb b/app/models/template_builder/resource/s3/bucket.rb index 15f576d36..938bb7dff 100644 --- a/app/models/template_builder/resource/s3/bucket.rb +++ b/app/models/template_builder/resource/s3/bucket.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/user.rb b/app/models/user.rb index aad4c7790..5f7a7811b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/user_project.rb b/app/models/user_project.rb index b14ba37aa..6525f2899 100644 --- a/app/models/user_project.rb +++ b/app/models/user_project.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/user_zabbix_server.rb b/app/models/user_zabbix_server.rb index c9f5fcad0..d99e7d485 100644 --- a/app/models/user_zabbix_server.rb +++ b/app/models/user_zabbix_server.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/ws_connector.rb b/app/models/ws_connector.rb index c7e16656c..fcb76f6cc 100644 --- a/app/models/ws_connector.rb +++ b/app/models/ws_connector.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/yum_schedule.rb b/app/models/yum_schedule.rb index 818d607cf..2420a43fd 100644 --- a/app/models/yum_schedule.rb +++ b/app/models/yum_schedule.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/models/zabbix.rb b/app/models/zabbix.rb index a61b28acb..49238fb8f 100644 --- a/app/models/zabbix.rb +++ b/app/models/zabbix.rb @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/application_policy.rb b/app/policies/application_policy.rb index 476d16ebc..ff5d762aa 100644 --- a/app/policies/application_policy.rb +++ b/app/policies/application_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/cf_template_policy.rb b/app/policies/cf_template_policy.rb index e88e1e43b..155197abe 100644 --- a/app/policies/cf_template_policy.rb +++ b/app/policies/cf_template_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/client_policy.rb b/app/policies/client_policy.rb index 77767b008..27da5ad71 100644 --- a/app/policies/client_policy.rb +++ b/app/policies/client_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/spec/models/dish_serverspec_spec.rb b/app/policies/database_policy.rb similarity index 65% rename from spec/models/dish_serverspec_spec.rb rename to app/policies/database_policy.rb index ab6925a56..a3b82fd8c 100644 --- a/spec/models/dish_serverspec_spec.rb +++ b/app/policies/database_policy.rb @@ -6,7 +6,6 @@ # http://opensource.org/licenses/mit-license.php # -require_relative '../spec_helper' - -RSpec.describe DishServerspec, type: :model do +class DatabasePolicy < ApplicationPolicy + master_admin :index?, :export?, :import? end diff --git a/app/policies/dish_policy.rb b/app/policies/dish_policy.rb index aff5cccc2..ea6b64945 100644 --- a/app/policies/dish_policy.rb +++ b/app/policies/dish_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/ec2_instance_policy.rb b/app/policies/ec2_instance_policy.rb index a87831874..d57fff685 100644 --- a/app/policies/ec2_instance_policy.rb +++ b/app/policies/ec2_instance_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/infrastructure_policy.rb b/app/policies/infrastructure_policy.rb index 41f84123c..e82ed6d15 100644 --- a/app/policies/infrastructure_policy.rb +++ b/app/policies/infrastructure_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/key_pair_policy.rb b/app/policies/key_pair_policy.rb index df2b6db87..c38188ab4 100644 --- a/app/policies/key_pair_policy.rb +++ b/app/policies/key_pair_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/monitoring_policy.rb b/app/policies/monitoring_policy.rb index 8f2800840..ad62fc40a 100644 --- a/app/policies/monitoring_policy.rb +++ b/app/policies/monitoring_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/node_policy.rb b/app/policies/node_policy.rb index 41d20bdf3..4c475c9d9 100644 --- a/app/policies/node_policy.rb +++ b/app/policies/node_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/project_parameter_policy.rb b/app/policies/project_parameter_policy.rb index d9b72dc04..3c9570af9 100644 --- a/app/policies/project_parameter_policy.rb +++ b/app/policies/project_parameter_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb index aa9b40c1b..0340b1fc8 100644 --- a/app/policies/project_policy.rb +++ b/app/policies/project_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/serverspec_policy.rb b/app/policies/servertest_policy.rb similarity index 65% rename from app/policies/serverspec_policy.rb rename to app/policies/servertest_policy.rb index a13e76983..2c434e955 100644 --- a/app/policies/serverspec_policy.rb +++ b/app/policies/servertest_policy.rb @@ -1,12 +1,12 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # # http://opensource.org/licenses/mit-license.php # -class ServerspecPolicy < ApplicationPolicy +class ServertestPolicy < ApplicationPolicy %i[index? show?].each do |action| define_method(action) do if record.infrastructure @@ -17,7 +17,7 @@ class ServerspecPolicy < ApplicationPolicy end end - %i[new? update? create? edit? destroy? select? results? run? create_for_rds? schedule? generator?].each do |action| + %i[new? update? create? edit? generate_awspec? destroy? select? results? run_serverspec? create_for_rds? schedule? generator? awspec_generator?].each do |action| define_method(action) do if record.infrastructure user.allow?(record.infrastructure) && user.admin? diff --git a/app/policies/snapshot_policy.rb b/app/policies/snapshot_policy.rb index 77dfeb6e5..58a66b434 100644 --- a/app/policies/snapshot_policy.rb +++ b/app/policies/snapshot_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/template_builder_policy.rb b/app/policies/template_builder_policy.rb index ce5474f43..27a73d9a3 100644 --- a/app/policies/template_builder_policy.rb +++ b/app/policies/template_builder_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb index 5c8f2b59e..1ad49dd9d 100644 --- a/app/policies/user_policy.rb +++ b/app/policies/user_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/policies/zabbix_server_policy.rb b/app/policies/zabbix_server_policy.rb index c2a85f246..21cf11590 100644 --- a/app/policies/zabbix_server_policy.rb +++ b/app/policies/zabbix_server_policy.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/validators/json_validator.rb b/app/validators/json_validator.rb index a650b458d..1827dd28e 100644 --- a/app/validators/json_validator.rb +++ b/app/validators/json_validator.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/validators/project_code_validator.rb b/app/validators/project_code_validator.rb index 0f5d40b5c..c49176a2f 100644 --- a/app/validators/project_code_validator.rb +++ b/app/validators/project_code_validator.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/validators/rsa_validator.rb b/app/validators/rsa_validator.rb index 74f1873eb..1c0f88f12 100644 --- a/app/validators/rsa_validator.rb +++ b/app/validators/rsa_validator.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/validators/ruby_validator.rb b/app/validators/ruby_validator.rb index 651b184d7..a24f61f21 100644 --- a/app/validators/ruby_validator.rb +++ b/app/validators/ruby_validator.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/validators/zabbix_server_fqdn_validator.rb b/app/validators/zabbix_server_fqdn_validator.rb index 5778a67a5..6337e9623 100644 --- a/app/validators/zabbix_server_fqdn_validator.rb +++ b/app/validators/zabbix_server_fqdn_validator.rb @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016 SKYARCH NETWORKS INC. +# Copyright (c) 2013-2017 SKYARCH NETWORKS INC. # # This software is released under the MIT License. # diff --git a/app/views/app_settings/_panel_content_system.html.erb b/app/views/app_settings/_panel_content_system.html.erb index d8c8baa84..fd3403687 100644 --- a/app/views/app_settings/_panel_content_system.html.erb +++ b/app/views/app_settings/_panel_content_system.html.erb @@ -92,6 +92,29 @@ + + +
+ <%= t('common.optional') %> +
+ +
+ +
+
+ +
+ +
+ +
+
+
diff --git a/app/views/app_settings/db.html.erb b/app/views/app_settings/db.html.erb deleted file mode 100644 index 1f8c8e0c9..000000000 --- a/app/views/app_settings/db.html.erb +++ /dev/null @@ -1,23 +0,0 @@ -<% provide(:title, t('infrastructures.database')) %> -

<%= t('infrastructures.database') %>

- -
-
-
-
- <%= t('common.btn.export') %> -

<%= t('app_settings.msg.db_export')%>

-
    -
  • <%= t('app_settings.msg.env', {env: Rails.env.capitalize}) %>
  • -
  • <%= t('app_settings.msg.secret')%>
  • -
  • <%= t('app_settings.msg.db_key')%>
  • -
- - - - <%= t('common.btn.export') %> - -
-
-
-
diff --git a/app/views/app_settings/show.html.erb b/app/views/app_settings/show.html.erb index 443c793ef..ab398a9e6 100644 --- a/app/views/app_settings/show.html.erb +++ b/app/views/app_settings/show.html.erb @@ -10,7 +10,10 @@
<%= I18n.t("app_settings.title.setup") %> - +
<%= render partial: 'panel_content_system' %> @@ -23,3 +26,5 @@
+ +<%= render partial: 'databases/modal_import' %> diff --git a/app/views/databases/_modal_export.html.erb b/app/views/databases/_modal_export.html.erb new file mode 100644 index 000000000..8f770b844 --- /dev/null +++ b/app/views/databases/_modal_export.html.erb @@ -0,0 +1,36 @@ + + diff --git a/app/views/databases/_modal_import.html.erb b/app/views/databases/_modal_import.html.erb new file mode 100644 index 000000000..d117346cc --- /dev/null +++ b/app/views/databases/_modal_import.html.erb @@ -0,0 +1,55 @@ + + diff --git a/app/views/databases/show.html.erb b/app/views/databases/show.html.erb new file mode 100644 index 000000000..314671b60 --- /dev/null +++ b/app/views/databases/show.html.erb @@ -0,0 +1,25 @@ +<% provide(:title, t('infrastructures.database')) %> +

<%= t('infrastructures.database') %>

+ + +
+
+

<%= t('databases.db_management') %>

+

+

+ <% if app_setting_is_set %> + + <% end %> + +

+
+ + <%= render 'modal_export' if app_setting_is_set %> + <%= render 'modal_import' %> +
diff --git a/app/views/infrastructures/_show.html.erb b/app/views/infrastructures/_show.html.erb index 283458b83..c2cba8e50 100644 --- a/app/views/infrastructures/_show.html.erb +++ b/app/views/infrastructures/_show.html.erb @@ -31,7 +31,7 @@