cloud-templates 0.1.0

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