charmkit 0.5.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/README.md +46 -94
  4. data/charmkit.gemspec +3 -3
  5. data/examples/Charmkitfile +66 -0
  6. data/examples/basic.rb +6 -0
  7. data/examples/demo/Gemfile +10 -0
  8. data/examples/demo/Gemfile.lock +64 -0
  9. data/examples/demo/README.md +27 -0
  10. data/examples/demo/Rakefile +9 -0
  11. data/examples/demo/config.yaml +2 -0
  12. data/examples/demo/hooks/config-changed +3 -0
  13. data/examples/{my-demo-charm → demo}/hooks/install +3 -5
  14. data/examples/demo/hooks/leader-elected +3 -0
  15. data/examples/demo/hooks/leader-settings-changed +3 -0
  16. data/examples/demo/hooks/start +3 -0
  17. data/examples/demo/hooks/stop +3 -0
  18. data/examples/demo/hooks/update-status +3 -0
  19. data/examples/demo/hooks/upgrade-charm +3 -0
  20. data/examples/demo/metadata.yaml +9 -0
  21. data/examples/load-charmkit-file.rb +2 -0
  22. data/examples/plugin_loader.rb +9 -0
  23. data/examples/template.rb +6 -0
  24. data/examples/templates/user_auth.txt +1 -0
  25. data/exe/charmkit +5 -0
  26. data/lib/charmkit.rb +6 -7
  27. data/lib/charmkit/cli.rb +124 -0
  28. data/lib/charmkit/dependencies.rb +26 -0
  29. data/lib/charmkit/helpers.rb +5 -0
  30. data/lib/charmkit/helpers/crypt.rb +8 -6
  31. data/lib/charmkit/helpers/fs.rb +0 -15
  32. data/lib/charmkit/helpers/hookenv.rb +10 -0
  33. data/lib/charmkit/helpers/runner.rb +2 -1
  34. data/lib/charmkit/helpers/template.rb +1 -0
  35. data/lib/charmkit/hook.rb +47 -0
  36. data/lib/charmkit/scroll.rb +15 -0
  37. metadata +48 -29
  38. data/examples/my-demo-charm/Gemfile +0 -5
  39. data/examples/my-demo-charm/Gemfile.lock +0 -15
  40. data/examples/my-demo-charm/README.md +0 -45
  41. data/examples/my-demo-charm/Rakefile +0 -63
  42. data/examples/my-demo-charm/config.yaml +0 -21
  43. data/examples/my-demo-charm/copyright +0 -21
  44. data/examples/my-demo-charm/hooks/config-changed +0 -3
  45. data/examples/my-demo-charm/hooks/upgrade-charm +0 -3
  46. data/examples/my-demo-charm/icon.svg +0 -322
  47. data/examples/my-demo-charm/metadata.yaml +0 -18
  48. data/examples/my-demo-charm/readme +0 -1
  49. data/examples/my-demo-charm/tasks/vim.rb +0 -8
  50. data/examples/my-demo-charm/templates/acl.auth.php +0 -10
  51. data/examples/my-demo-charm/templates/local.php +0 -15
  52. data/examples/my-demo-charm/templates/plugins.local.php +0 -12
  53. data/examples/my-demo-charm/templates/users.auth.php +0 -11
  54. data/examples/my-demo-charm/templates/vhost.conf +0 -42
  55. data/examples/render_inline.rb +0 -59
  56. data/lib/charmkit/extend/string_tools.rb +0 -14
  57. data/lib/charmkit/plugins/nginx.rb +0 -8
  58. data/lib/charmkit/plugins/php.rb +0 -19
  59. data/lib/charmkit/version.rb +0 -14
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ bundle exec rake leader_elected
3
+
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ bundle exec rake leader_settings_changed
3
+
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ bundle exec rake start
3
+
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ bundle exec rake stop
3
+
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ bundle exec rake update_status
3
+
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ bundle exec rake upgrade_charm
3
+
@@ -0,0 +1,9 @@
1
+ name: demo
2
+ summary: |
3
+ <<insert summary>>
4
+ description: |
5
+ <<insert description>>
6
+ maintainers: ['']
7
+ series:
8
+ - xenial
9
+
@@ -0,0 +1,2 @@
1
+ require 'charmkit/scroll'
2
+ load './Charmkitfile
@@ -0,0 +1,9 @@
1
+ require 'charmkit'
2
+
3
+ class Install < Charmkit
4
+ plugin :core
5
+
6
+ def summon
7
+ puts run 'ls -l /tmp'
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ require 'charmkit'
2
+
3
+ template 'templates/user_auth.txt', '/tmp/user_auth.txt',
4
+ firstname: "joe", lastname: "bob"
5
+
6
+ file "/tmp/another-test.txt", "owned"
@@ -0,0 +1 @@
1
+ Hi there <%= firstname %> <%= lastname %>
data/exe/charmkit ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'charmkit'
4
+
5
+ Charmkit::CLI.start
data/lib/charmkit.rb CHANGED
@@ -1,9 +1,8 @@
1
- require "charmkit/version"
2
- require "charmkit/helpers/template"
3
- require "charmkit/helpers/runner"
4
- require "charmkit/helpers/hookenv"
5
- require "charmkit/helpers/fs"
6
- require "charmkit/helpers/crypt"
1
+ require 'charmkit/helpers'
2
+ require 'charmkit/hook'
3
+ require 'charmkit/scroll'
4
+ require 'charmkit/dependencies'
5
+ require 'charmkit/cli'
7
6
 
8
7
  module Charmkit; end
9
- extend Charmkit::Helpers
8
+ extend Charmkit::Base
@@ -0,0 +1,124 @@
1
+ require "active_support/core_ext/string/inflections"
2
+ require 'pathname'
3
+ require 'thor'
4
+ require 'charmkit'
5
+ require 'charmkit/helpers'
6
+ require 'charmkit/dependencies'
7
+
8
+ module Charmkit
9
+ class CLI < Thor
10
+ desc "generate NAME", "generate a charm skelton"
11
+ def generate(name)
12
+ pn = Pathname(name)
13
+ if pn.directory?
14
+ puts "#{name} directory exists, please choose a different charm name."
15
+ exit 1
16
+ else
17
+ pn.mkpath
18
+ pn.join('hooks').mkpath
19
+ end
20
+ Helpers.inline_template 'config.yaml', pn/'config.yaml'
21
+ Helpers.inline_template 'metadata.yaml', pn/'metadata.yaml', name: name
22
+ Helpers.inline_template 'README.md', pn/'README.md', name: name
23
+ Helpers.inline_template 'Gemfile', pn/'Gemfile'
24
+
25
+ # Write the install hook
26
+ hook_path = pn.join('hooks/install')
27
+ Helpers.inline_template 'install-hook', hook_path
28
+ hook_path.chmod 0755
29
+
30
+ # Write other hooks
31
+ hooks = ['config-changed',
32
+ 'upgrade-charm',
33
+ 'start',
34
+ 'stop',
35
+ 'leader-elected',
36
+ 'leader-settings-changed',
37
+ 'update-status']
38
+ hooks.each do |hook|
39
+ hook_path = pn.join("hooks/#{hook}")
40
+ Helpers.inline_template 'generic-hook', hook_path, hook: hook.underscore
41
+ hook_path.chmod 0755
42
+ end
43
+
44
+ Helpers.inline_template 'Rakefile', pn/'Rakefile'
45
+ end
46
+ map "g" => "generate"
47
+ end
48
+ end
49
+
50
+
51
+ __END__
52
+
53
+ @@ Gemfile
54
+ # frozen_string_literal: true
55
+ source "https://rubygems.org"
56
+
57
+ gem "charmkit"
58
+ gem "rake"
59
+ gem "rspec"
60
+
61
+ # If you wish to load additional scrolls add those here
62
+ # gem "charmkit-scroll-nginx", :github => "battlemidget/charmkit-scroll-nginx"
63
+
64
+ @@ Rakefile
65
+ require 'charmkit'
66
+
67
+ desc "Install hook"
68
+ task :install do
69
+ use :nginx
70
+ nginx.add_host server_name: "example.com"
71
+ end
72
+
73
+ @@ install-hook
74
+ #!/bin/sh
75
+ apt-get update && apt-get install -qyf ruby bundler --no-install-recommends
76
+ bundle install --local --quiet --without development
77
+ # Do install task
78
+ bundle exec rake install
79
+
80
+ @@ generic-hook
81
+ #!/bin/sh
82
+ bundle exec rake <%= hook %>
83
+
84
+ @@ config.yaml
85
+ options: {}
86
+
87
+ @@ metadata.yaml
88
+ name: <%= name %>
89
+ summary: |
90
+ <<insert summary>>
91
+ description: |
92
+ <<insert description>>
93
+ maintainers: ['']
94
+ series:
95
+ - xenial
96
+
97
+ @@ README.md
98
+ # Overview
99
+
100
+ My charm Overview
101
+
102
+ # Usage
103
+
104
+ $ juju deploy <%= name %>
105
+
106
+ # Developers
107
+
108
+ How developers can contribute
109
+
110
+ # Maintainers
111
+
112
+ How QA and others can test your charm
113
+
114
+ # Author
115
+
116
+ Your name <mememe@email.com>
117
+
118
+ # Copyright
119
+
120
+ 2016 Your name
121
+
122
+ # License
123
+
124
+ MIT
@@ -0,0 +1,26 @@
1
+ module Charmkit
2
+ class Dependencies
3
+ include Enumerable
4
+
5
+ @@deps = []
6
+
7
+ def self.empty?
8
+ @@deps.empty?
9
+ end
10
+
11
+ def self.install
12
+ # TODO: Should be a dependency class with options for
13
+ # installing groups, recommended packages, and snaps
14
+ puts "Installing #{@@deps.join(' ')}"
15
+ end
16
+
17
+ def self.<<(o)
18
+ @@deps << o
19
+ self
20
+ end
21
+
22
+ def self.to_s
23
+ @@deps.join(' ')
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ require 'charmkit/helpers/runner'
2
+ require 'charmkit/helpers/fs'
3
+ require 'charmkit/helpers/template'
4
+ require 'charmkit/helpers/hookenv'
5
+ require 'charmkit/helpers/crypt'
@@ -1,11 +1,13 @@
1
1
  module Charmkit
2
2
  module Helpers
3
- # Generate a password salt
4
- #
5
- # @param [Integer] min mininum number of characters
6
- # @param [Integer] max maximum number of characters
7
- def gen_salt(min=0, max=20)
8
- (min...max).map { ('a'..'z').to_a[rand(26)] }.join
3
+ class Crypt
4
+ # Generate a password salt
5
+ #
6
+ # @param [Integer] min mininum number of characters
7
+ # @param [Integer] max maximum number of characters
8
+ def self.gen_salt(min=0, max=20)
9
+ (min...max).map { ('a'..'z').to_a[rand(26)] }.join
10
+ end
9
11
  end
10
12
  end
11
13
  end
@@ -19,21 +19,6 @@ module Charmkit
19
19
  File.write(dst, content)
20
20
  end
21
21
 
22
- # Check if file exists
23
- #
24
- # @param path String
25
- # @return Boolean
26
- #
27
- # @example
28
- # is_file? "/etc/nginx/nginx.conf"
29
- def is_file?(path)
30
- return File.exists? path
31
- end
32
-
33
- def is_dir?(path)
34
- return Dir.exists? path
35
- end
36
-
37
22
  def cat(src)
38
23
  return File.read(src)
39
24
  end
@@ -38,6 +38,16 @@ module Charmkit
38
38
  return out.chomp
39
39
  end
40
40
 
41
+ def relation(item)
42
+ out, err = cmd.run "relation-get '#{item}'"
43
+ return out.chomp
44
+ end
45
+
46
+ def relation=(key, item)
47
+ out, err = cmd.run "relation-set '#{key}=#{item}'"
48
+ return out.chomp
49
+ end
50
+
41
51
  def log(msg)
42
52
  cmd.run "juju-log #{msg}"
43
53
  end
@@ -3,7 +3,7 @@ require 'tty-command'
3
3
  module Charmkit
4
4
  module Helpers
5
5
  extend Forwardable
6
- def_delegators :cmd, :run, :run!, :test
6
+ def_delegators :cmd, :run, :run!
7
7
 
8
8
  def cmd
9
9
  if ENV['DRYRUN']
@@ -12,5 +12,6 @@ module Charmkit
12
12
  TTY::Command.new
13
13
  end
14
14
  end
15
+
15
16
  end
16
17
  end
@@ -76,5 +76,6 @@ module Charmkit
76
76
  File.write(dst, rendered)
77
77
  end
78
78
  end
79
+ module_function :inline_template
79
80
  end
80
81
  end
@@ -0,0 +1,47 @@
1
+ module Charmkit
2
+ module Base
3
+ include Helpers
4
+
5
+ # Include scrolls to be used within hook execution
6
+ #
7
+ # Note: Idea lifted from https://github.com/mckomo/metaxa
8
+ # @param [Symbol] name symbol of scroll
9
+ # @param [Hash] options (NotImplemented) Options to be passed to scroll
10
+ # @example
11
+ # use :nginx
12
+ # nginx.add_host server: "test.com"
13
+ def use(name, options = {})
14
+ require "charmkit/scrolls/#{name.to_s}"
15
+ name_ref = name
16
+ if options[:alias]
17
+ name_ref = options[:alias]
18
+ end
19
+
20
+ var_module = Module.new do
21
+ attr_accessor name_ref.to_sym
22
+ end
23
+ extend var_module
24
+ set(name_ref, to_const(name.to_s).new)
25
+ end
26
+
27
+ # Access deps class
28
+ #
29
+ def deps
30
+ Dependencies
31
+ end
32
+
33
+ private
34
+ def get(variable)
35
+ instance_variable_get("@#{variable}")
36
+ end
37
+
38
+ def set(variable, value)
39
+ instance_variable_set("@#{variable}", value)
40
+ end
41
+
42
+ def to_const(name)
43
+ klass = name.classify
44
+ klass.constantize
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ module Charmkit
2
+ class Scroll
3
+ include Helpers
4
+
5
+ class << self
6
+ # Apt packages that the scroll requires
7
+ #
8
+ # @param [String] pkg Name of apt package
9
+ def depends_on(pkg)
10
+ Dependencies << pkg
11
+ end
12
+
13
+ end
14
+ end
15
+ end
metadata CHANGED
@@ -1,17 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: charmkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Stokes
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-21 00:00:00.000000000 Z
11
+ date: 2017-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tty-command
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - ">="
@@ -25,7 +39,7 @@ dependencies:
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
- name: activesupport
42
+ name: thor
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ">="
@@ -39,7 +53,7 @@ dependencies:
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
- name: thor
56
+ name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - ">="
@@ -125,12 +139,14 @@ dependencies:
125
139
  description: ''
126
140
  email:
127
141
  - battlemidget@users.noreply.github.com
128
- executables: []
142
+ executables:
143
+ - charmkit
129
144
  extensions: []
130
145
  extra_rdoc_files: []
131
146
  files:
132
147
  - ".gitignore"
133
148
  - ".rspec"
149
+ - ".ruby-version"
134
150
  - ".travis.yml"
135
151
  - CODE_OF_CONDUCT.md
136
152
  - Gemfile
@@ -140,35 +156,38 @@ files:
140
156
  - bin/console
141
157
  - bin/setup
142
158
  - charmkit.gemspec
143
- - examples/my-demo-charm/Gemfile
144
- - examples/my-demo-charm/Gemfile.lock
145
- - examples/my-demo-charm/README.md
146
- - examples/my-demo-charm/Rakefile
147
- - examples/my-demo-charm/config.yaml
148
- - examples/my-demo-charm/copyright
149
- - examples/my-demo-charm/hooks/config-changed
150
- - examples/my-demo-charm/hooks/install
151
- - examples/my-demo-charm/hooks/upgrade-charm
152
- - examples/my-demo-charm/icon.svg
153
- - examples/my-demo-charm/metadata.yaml
154
- - examples/my-demo-charm/readme
155
- - examples/my-demo-charm/tasks/vim.rb
156
- - examples/my-demo-charm/templates/acl.auth.php
157
- - examples/my-demo-charm/templates/local.php
158
- - examples/my-demo-charm/templates/plugins.local.php
159
- - examples/my-demo-charm/templates/users.auth.php
160
- - examples/my-demo-charm/templates/vhost.conf
161
- - examples/render_inline.rb
159
+ - examples/Charmkitfile
160
+ - examples/basic.rb
161
+ - examples/demo/Gemfile
162
+ - examples/demo/Gemfile.lock
163
+ - examples/demo/README.md
164
+ - examples/demo/Rakefile
165
+ - examples/demo/config.yaml
166
+ - examples/demo/hooks/config-changed
167
+ - examples/demo/hooks/install
168
+ - examples/demo/hooks/leader-elected
169
+ - examples/demo/hooks/leader-settings-changed
170
+ - examples/demo/hooks/start
171
+ - examples/demo/hooks/stop
172
+ - examples/demo/hooks/update-status
173
+ - examples/demo/hooks/upgrade-charm
174
+ - examples/demo/metadata.yaml
175
+ - examples/load-charmkit-file.rb
176
+ - examples/plugin_loader.rb
177
+ - examples/template.rb
178
+ - examples/templates/user_auth.txt
179
+ - exe/charmkit
162
180
  - lib/charmkit.rb
163
- - lib/charmkit/extend/string_tools.rb
181
+ - lib/charmkit/cli.rb
182
+ - lib/charmkit/dependencies.rb
183
+ - lib/charmkit/helpers.rb
164
184
  - lib/charmkit/helpers/crypt.rb
165
185
  - lib/charmkit/helpers/fs.rb
166
186
  - lib/charmkit/helpers/hookenv.rb
167
187
  - lib/charmkit/helpers/runner.rb
168
188
  - lib/charmkit/helpers/template.rb
169
- - lib/charmkit/plugins/nginx.rb
170
- - lib/charmkit/plugins/php.rb
171
- - lib/charmkit/version.rb
189
+ - lib/charmkit/hook.rb
190
+ - lib/charmkit/scroll.rb
172
191
  homepage: http://charmkit.org
173
192
  licenses:
174
193
  - MIT
@@ -189,7 +208,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
208
  version: '0'
190
209
  requirements: []
191
210
  rubyforge_project:
192
- rubygems_version: 2.5.1
211
+ rubygems_version: 2.6.8
193
212
  signing_key:
194
213
  specification_version: 4
195
214
  summary: Helps with charm authoring