charmkit 0.5.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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