cloud-templates 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +29 -0
  3. data/.simplecov +6 -0
  4. data/Gemfile +2 -0
  5. data/LICENSE +201 -0
  6. data/NOTICE +13 -0
  7. data/README.md +124 -0
  8. data/Rakefile +27 -0
  9. data/cloud-templates.gemspec +27 -0
  10. data/examples/lib/user_directory/artifacts/catalogized.rb +11 -0
  11. data/examples/lib/user_directory/artifacts/group.rb +37 -0
  12. data/examples/lib/user_directory/artifacts/ided.rb +11 -0
  13. data/examples/lib/user_directory/artifacts/organization.rb +17 -0
  14. data/examples/lib/user_directory/artifacts/pathed.rb +22 -0
  15. data/examples/lib/user_directory/artifacts/person.rb +20 -0
  16. data/examples/lib/user_directory/artifacts/team.rb +31 -0
  17. data/examples/lib/user_directory/artifacts/unit.rb +24 -0
  18. data/examples/lib/user_directory/artifacts/user.rb +29 -0
  19. data/examples/lib/user_directory/render/etc/artifact_view.rb +15 -0
  20. data/examples/lib/user_directory/render/etc/composite_view.rb +26 -0
  21. data/examples/lib/user_directory/render/etc/group_view.rb +23 -0
  22. data/examples/lib/user_directory/render/etc/person_view.rb +19 -0
  23. data/examples/lib/user_directory/render/etc/registry.rb +33 -0
  24. data/examples/lib/user_directory/render/etc/user_view.rb +35 -0
  25. data/examples/lib/user_directory/render/etc.rb +3 -0
  26. data/examples/lib/user_directory/render/ldap/artifact_view.rb +27 -0
  27. data/examples/lib/user_directory/render/ldap/composite_view.rb +32 -0
  28. data/examples/lib/user_directory/render/ldap/group_view.rb +28 -0
  29. data/examples/lib/user_directory/render/ldap/organization_view.rb +26 -0
  30. data/examples/lib/user_directory/render/ldap/person_view.rb +39 -0
  31. data/examples/lib/user_directory/render/ldap/registry.rb +16 -0
  32. data/examples/lib/user_directory/render/ldap/unit_view.rb +26 -0
  33. data/examples/lib/user_directory/render/ldap/user_view.rb +39 -0
  34. data/examples/lib/user_directory/render/ldap.rb +3 -0
  35. data/examples/lib/user_directory/utils.rb +18 -0
  36. data/examples/lib/user_directory.rb +23 -0
  37. data/examples/lib_path.rb +2 -0
  38. data/examples/spec/spec_helper.rb +1 -0
  39. data/examples/spec/user_directory_spec.rb +568 -0
  40. data/lib/aws/templates/artifact.rb +140 -0
  41. data/lib/aws/templates/composite.rb +178 -0
  42. data/lib/aws/templates/exceptions.rb +221 -0
  43. data/lib/aws/templates/render/registry.rb +60 -0
  44. data/lib/aws/templates/render/utils/base_type_views.rb +131 -0
  45. data/lib/aws/templates/render/view.rb +127 -0
  46. data/lib/aws/templates/render.rb +72 -0
  47. data/lib/aws/templates/utils/artifact_storage.rb +141 -0
  48. data/lib/aws/templates/utils/contextualized/filters.rb +437 -0
  49. data/lib/aws/templates/utils/contextualized/hash.rb +13 -0
  50. data/lib/aws/templates/utils/contextualized/nil.rb +13 -0
  51. data/lib/aws/templates/utils/contextualized/proc.rb +13 -0
  52. data/lib/aws/templates/utils/contextualized.rb +113 -0
  53. data/lib/aws/templates/utils/default.rb +185 -0
  54. data/lib/aws/templates/utils/dependency/enumerable.rb +13 -0
  55. data/lib/aws/templates/utils/dependency/object.rb +46 -0
  56. data/lib/aws/templates/utils/dependency.rb +121 -0
  57. data/lib/aws/templates/utils/dependent.rb +28 -0
  58. data/lib/aws/templates/utils/inheritable.rb +52 -0
  59. data/lib/aws/templates/utils/late_bound.rb +89 -0
  60. data/lib/aws/templates/utils/memoized.rb +27 -0
  61. data/lib/aws/templates/utils/named.rb +19 -0
  62. data/lib/aws/templates/utils/options.rb +279 -0
  63. data/lib/aws/templates/utils/parametrized/constraints.rb +423 -0
  64. data/lib/aws/templates/utils/parametrized/getters.rb +293 -0
  65. data/lib/aws/templates/utils/parametrized/guarded.rb +32 -0
  66. data/lib/aws/templates/utils/parametrized/mapper.rb +73 -0
  67. data/lib/aws/templates/utils/parametrized/nested.rb +72 -0
  68. data/lib/aws/templates/utils/parametrized/transformations.rb +660 -0
  69. data/lib/aws/templates/utils/parametrized.rb +240 -0
  70. data/lib/aws/templates/utils.rb +219 -0
  71. data/lib/aws/templates.rb +16 -0
  72. data/spec/aws/templates/artifact_spec.rb +161 -0
  73. data/spec/aws/templates/composite_spec.rb +361 -0
  74. data/spec/aws/templates/render/utils/base_type_views_spec.rb +104 -0
  75. data/spec/aws/templates/render_spec.rb +62 -0
  76. data/spec/aws/templates/utils/as_named_spec.rb +31 -0
  77. data/spec/aws/templates/utils/contextualized/filters_spec.rb +108 -0
  78. data/spec/aws/templates/utils/contextualized_spec.rb +115 -0
  79. data/spec/aws/templates/utils/late_bound_spec.rb +52 -0
  80. data/spec/aws/templates/utils/options_spec.rb +67 -0
  81. data/spec/aws/templates/utils/parametrized/constraint_spec.rb +175 -0
  82. data/spec/aws/templates/utils/parametrized/getters_spec.rb +139 -0
  83. data/spec/aws/templates/utils/parametrized/transformation_spec.rb +314 -0
  84. data/spec/aws/templates/utils/parametrized_spec.rb +241 -0
  85. data/spec/spec_helper.rb +6 -0
  86. metadata +244 -0
@@ -0,0 +1,15 @@
1
+ require 'user_directory/render/etc/registry'
2
+
3
+ module UserDirectory
4
+ module Render
5
+ module Etc
6
+ ##
7
+ # Basic render
8
+ #
9
+ # It just puts a link between children and type registrar
10
+ class ArtifactView < Aws::Templates::Render::View
11
+ register_in Render::Etc
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ require 'aws/templates/composite'
2
+ require 'user_directory/render/etc/artifact_view'
3
+
4
+ module UserDirectory
5
+ module Render
6
+ module Etc
7
+ ##
8
+ # Composite render
9
+ #
10
+ # It aggregates group and passwd entries from children and merges
11
+ # them into single entry
12
+ class CompositeView < ArtifactView
13
+ artifact Aws::Templates::Composite
14
+
15
+ def prepare
16
+ rendered_for(instance.artifacts.values)
17
+ .each_with_object(Diff.new([], [])) do |diff, memo|
18
+ memo.passwd.concat(diff.passwd)
19
+ memo.group.concat(diff.group)
20
+ memo
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ require 'user_directory/render/etc/artifact_view'
2
+
3
+ module UserDirectory
4
+ module Render
5
+ module Etc
6
+ ##
7
+ # POSIX group render
8
+ #
9
+ # Creates group file entry.
10
+ class GroupView < ArtifactView
11
+ artifact UserDirectory::Group
12
+
13
+ def prepare
14
+ Diff.new [], [group_record.join(':')]
15
+ end
16
+
17
+ def group_record
18
+ in_instance { [name, 'x', id, members.map(&:login).join(',')] }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ require 'user_directory/render/etc/user_view'
2
+
3
+ module UserDirectory
4
+ module Render
5
+ module Etc
6
+ ##
7
+ # Person render
8
+ #
9
+ # The same as POSIX user but with customized GECOS field.
10
+ class PersonView < UserView
11
+ artifact UserDirectory::Person
12
+
13
+ def user_info
14
+ in_instance { "#{cn},,#{phone}" }
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,33 @@
1
+ require 'aws/templates/render/utils/base_type_views'
2
+ require 'aws/templates/render/view'
3
+ require 'pathname'
4
+
5
+ module UserDirectory
6
+ module Render
7
+ ##
8
+ # UNIX passwd/group render
9
+ #
10
+ # Transforms formed catalog artifacts into standard UNIX passwd/group
11
+ # representation.
12
+ module Etc
13
+ extend Aws::Templates::Render::Utils::BaseTypeViews
14
+ initialize_base_type_views
15
+ register Pathname, Aws::Templates::Render::Utils::BaseTypeViews::ToString
16
+ Diff = Struct.new(:passwd, :group)
17
+
18
+ ##
19
+ # Diff view
20
+ #
21
+ # Creates Diff object out of the instance atached with recursively rendered passwd and group
22
+ # fields.
23
+ class DiffView < Aws::Templates::Render::BasicView
24
+ register_in Etc
25
+ artifact Diff
26
+
27
+ def to_rendered
28
+ Diff.new rendered_for(instance.passwd), rendered_for(instance.group)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,35 @@
1
+ require 'user_directory/render/etc/artifact_view'
2
+ require 'user_directory/artifacts/user'
3
+
4
+ module UserDirectory
5
+ module Render
6
+ module Etc
7
+ ##
8
+ # POSIX user render
9
+ #
10
+ # It creates passwd file entry
11
+ class UserView < ArtifactView
12
+ artifact UserDirectory::User
13
+
14
+ def prepare
15
+ Diff.new [user_record.join(':')], []
16
+ end
17
+
18
+ def user_record
19
+ [
20
+ instance.login, 'x', instance.id, instance.group.id,
21
+ user_info, path_for(instance.home_directory), path_for(instance.shell)
22
+ ]
23
+ end
24
+
25
+ def user_info
26
+ instance.login
27
+ end
28
+
29
+ def path_for(obj)
30
+ obj && obj.path
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,3 @@
1
+ Dir.glob("#{File.dirname(__FILE__)}/etc/*.rb").each do |file|
2
+ require file
3
+ end
@@ -0,0 +1,27 @@
1
+ require 'aws/templates/artifact'
2
+ require 'user_directory/render/ldap/registry'
3
+
4
+ module UserDirectory
5
+ module Render
6
+ module LDAP
7
+ ##
8
+ # Basic render
9
+ #
10
+ # It just puts a link between children and type registrar
11
+ class ArtifactView < Aws::Templates::Render::View
12
+ register_in Render::LDAP
13
+ artifact Aws::Templates::Artifact
14
+
15
+ def prepare
16
+ { dn: instance.dn, objectClass: object_class }
17
+ end
18
+
19
+ protected
20
+
21
+ def object_class
22
+ %w[top]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,32 @@
1
+ require 'aws/templates/composite'
2
+ require 'user_directory/render/ldap/registry'
3
+
4
+ module UserDirectory
5
+ module Render
6
+ module LDAP
7
+ ##
8
+ # Composite render
9
+ #
10
+ # It aggregates LDIF entries from the children into a single list
11
+ # putting composite's own LDIF entry into the list head.
12
+ class CompositeView < Aws::Templates::Render::View
13
+ register_in Render::LDAP
14
+ artifact Aws::Templates::Composite
15
+
16
+ def prepare
17
+ rendered_for(instance.artifacts.values).flatten.unshift(entry)
18
+ end
19
+
20
+ protected
21
+
22
+ def entry
23
+ { dn: instance.dn, objectClass: object_class }
24
+ end
25
+
26
+ def object_class
27
+ %w[top]
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ require 'user_directory/render/ldap/artifact_view'
2
+ require 'user_directory/artifacts/group'
3
+
4
+ module UserDirectory
5
+ module Render
6
+ module LDAP
7
+ ##
8
+ # POSIX group render
9
+ #
10
+ # Creates group LDIF entry.
11
+ class GroupView < ArtifactView
12
+ artifact UserDirectory::Group
13
+
14
+ def prepare
15
+ super().merge(
16
+ in_instance { { cn: cn, gidNumber: id, memberUid: members.map(&:login) } }
17
+ )
18
+ end
19
+
20
+ protected
21
+
22
+ def object_class
23
+ super() << 'posixGroup'
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,26 @@
1
+ require 'user_directory/render/ldap/composite_view'
2
+ require 'user_directory/artifacts/organization'
3
+
4
+ module UserDirectory
5
+ module Render
6
+ module LDAP
7
+ ##
8
+ # Catalog's organization render
9
+ #
10
+ # It renders into organization's LDIF entry with merged list of children.
11
+ class OrganizationView < CompositeView
12
+ artifact UserDirectory::Organization
13
+
14
+ protected
15
+
16
+ def entry
17
+ super().merge(o: instance.name)
18
+ end
19
+
20
+ def object_class
21
+ super() << 'organization'
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,39 @@
1
+ require 'user_directory/render/ldap/user_view'
2
+ require 'user_directory/artifacts/person'
3
+
4
+ module UserDirectory
5
+ module Render
6
+ module LDAP
7
+ ##
8
+ # Person render
9
+ #
10
+ # It merges POSIX user entry with additional fields and object
11
+ # types valid for a real person.
12
+ class PersonView < UserView
13
+ artifact UserDirectory::Person
14
+
15
+ def prepare
16
+ hsh = in_instance do
17
+ hsh = {
18
+ gecos: "#{cn},,#{phone}",
19
+ givenName: given_name,
20
+ sn: last_name
21
+ }
22
+
23
+ hsh[:manager] = manager.dn if manager
24
+
25
+ hsh
26
+ end
27
+
28
+ super().merge(hsh)
29
+ end
30
+
31
+ protected
32
+
33
+ def object_class
34
+ super().concat(%w[inetOrgPerson person])
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ require 'aws/templates/render/utils/base_type_views'
2
+ require 'pathname'
3
+
4
+ module UserDirectory
5
+ module Render
6
+ ##
7
+ # LDIF render
8
+ #
9
+ # Transforms formed catalog artifacts into LDIF definition.
10
+ module LDAP
11
+ extend Aws::Templates::Render::Utils::BaseTypeViews
12
+ initialize_base_type_views
13
+ register Pathname, Aws::Templates::Render::Utils::BaseTypeViews::ToString
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ require 'user_directory/render/ldap/composite_view'
2
+ require 'user_directory/artifacts/unit'
3
+
4
+ module UserDirectory
5
+ module Render
6
+ module LDAP
7
+ ##
8
+ # Catalog's org unit render
9
+ #
10
+ # It renders into unit's LDIF entry with merged list of children.
11
+ class UnitView < CompositeView
12
+ artifact UserDirectory::Unit
13
+
14
+ protected
15
+
16
+ def entry
17
+ super().merge(ou: instance.name)
18
+ end
19
+
20
+ def object_class
21
+ super() << 'organizationalUnit'
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,39 @@
1
+ require 'user_directory/render/ldap/artifact_view'
2
+ require 'user_directory/artifacts/user'
3
+
4
+ module UserDirectory
5
+ module Render
6
+ module LDAP
7
+ ##
8
+ # POSIX user render
9
+ #
10
+ # It creates POSIX user LDIF entry
11
+ class UserView < ArtifactView
12
+ artifact UserDirectory::User
13
+
14
+ def prepare
15
+ super().merge(cn: instance.cn).merge(passwd_block)
16
+ end
17
+
18
+ def object_class
19
+ super() << 'posixAccount'
20
+ end
21
+
22
+ def passwd_block
23
+ {
24
+ uid: instance.login,
25
+ uidNumber: instance.id,
26
+ gidNumber: instance.group.id,
27
+ homeDirectory: path_for(instance.home_directory),
28
+ loginShell: path_for(instance.shell),
29
+ gecos: instance.login
30
+ }
31
+ end
32
+
33
+ def path_for(obj)
34
+ obj && obj.path.to_s
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ Dir.glob("#{File.dirname(__FILE__)}/ldap/*.rb").each do |file|
2
+ require file
3
+ end
@@ -0,0 +1,18 @@
1
+ require 'aws/templates/utils/parametrized/constraints'
2
+
3
+ module UserDirectory
4
+ ##
5
+ # Auxilliary utils
6
+ module Utils
7
+ ##
8
+ # Custom constraint for phone number
9
+ #
10
+ # Checks if value passed is a valid phone number
11
+ def self.phone_number
12
+ Aws::Templates::Utils::Parametrized::Constraint::SatisfiesCondition
13
+ .new('Should be a valid phone number') do |phone|
14
+ phone =~ /^[+]?[0-9\-]+$/
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ require 'user_directory/artifacts/user'
2
+ require 'user_directory/artifacts/person'
3
+ require 'user_directory/artifacts/group'
4
+ require 'user_directory/artifacts/unit'
5
+ require 'user_directory/artifacts/team'
6
+ require 'user_directory/artifacts/organization'
7
+
8
+ require 'user_directory/render/etc'
9
+ require 'user_directory/render/ldap'
10
+
11
+ ##
12
+ # Example implementation of catalog
13
+ #
14
+ # This is a demonstration of how one could use the framework.
15
+ # In this example, we can render set of users and groups embedded
16
+ # into org structure into two principally different representations:
17
+ # * UNIX passwd/group files
18
+ # * LDIF definition
19
+ # It is important to emphasize that representations are rendered from
20
+ # the same logical source. It is an example of loosened MVC pattern
21
+ # used in the framework.
22
+ module UserDirectory
23
+ end
@@ -0,0 +1,2 @@
1
+ libdir = File.dirname(__FILE__) + '/lib'
2
+ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
@@ -0,0 +1 @@
1
+ require 'simplecov'