moose-inventory 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7694cb8a3c33618943fcc8bd0542b466c1fc2661
4
- data.tar.gz: 057335d70625fca40ffc58f0e509b80466e5868c
3
+ metadata.gz: c371e17bbc7c89eb31612771e665eb281d7f0c4c
4
+ data.tar.gz: 169b4a227e853a706db3ae6a2831b9ad6adbe546
5
5
  SHA512:
6
- metadata.gz: 394c749d2d70e32e19514de5b00b60ccb45bc1829f8071804ec4f05b542e2fcbff0a1f27e28ba299d162a6c86ab4dc99bab9c180b31c4d38db18b102ec225a71
7
- data.tar.gz: 5598e22deade66147638d2f94d4453f75dfcb01797c70fb37047b5b5c3a5099f078388cc57f9967fab333e53e1b5c1191f1359d2542bc9c759427d760b2c6394
6
+ metadata.gz: a30eec0b29edcd53ac7e8df397e6adb48c2877b9f867ffdc5f9113abe04dbcaebe8f8d5cbe64e260c95e234ba645695942a70dafaa0c87dbf8229ca1a4def965
7
+ data.tar.gz: cc8adf6c82178b9d662dfed5399cb0a42121dee21d948aed1e8c14e9ce83443561a9e60d427f595d57f377b346f98ced9299bfd0c1b6fd8e11cca1639444f83b
@@ -11,8 +11,8 @@ module Moose
11
11
  require_relative 'group_get'
12
12
  require_relative 'group_list'
13
13
  require_relative 'group_rm'
14
- #require_relative 'group_addchild'
15
- #require_relative 'group_rmchild'
14
+ require_relative 'group_addchild'
15
+ require_relative 'group_rmchild'
16
16
  require_relative 'group_addhost'
17
17
  require_relative 'group_rmhost'
18
18
  require_relative 'group_addvar'
@@ -8,14 +8,85 @@ module Moose
8
8
  # Implemention of the "group addchild" methods of the CLI
9
9
  class Group < Thor # rubocop:disable ClassLength
10
10
  #==========================
11
- desc 'addchild [options] NAME CHILDNAME',
12
- 'Associate a child-group CHILDNAME with the group NAME'
13
- option :allowcreate, type: :boolean
14
- def addchild
15
- abort("The 'groups addchild GROUP' method is not yet implemented")
16
- puts 'group addchild'
11
+ desc 'addchild PARENTGROUP CHILDGROUP_1 [CHILDGROUP_2 ... ]',
12
+ 'Associate one or more child-groups CHILDGROUP_n with PARENTGROUP'
13
+ def addchild(*argv)
14
+
15
+ # Sanity check
16
+ if args.length < 2
17
+ abort("ERROR: Wrong number of arguments, #{args.length} "\
18
+ "for 2 or more.")
19
+ end
20
+
21
+ # Arguments
22
+ pname = args[0].downcase
23
+ cnames = args.slice(1, args.length - 1).uniq.map(&:downcase)
24
+
25
+ # Sanity
26
+ if pname == 'ungrouped' || cnames.include?('ungrouped')
27
+ abort("ERROR: Cannot manually manipulate the automatic group 'ungrouped'.")
28
+ end
29
+
30
+ # Convenience
31
+ db = Moose::Inventory::DB
32
+ fmt = Moose::Inventory::Cli::Formatter
33
+
34
+ # Transaction
35
+ warn_count = 0
36
+ begin
37
+ db.transaction do # Transaction start
38
+ puts "Associate parent group '#{pname}' with child group(s) '#{cnames.join(',')}':"
39
+ # Get the target group
40
+ fmt.puts 2, "- retrieve group '#{pname}'..."
41
+ pgroup = db.models[:group].find(name: pname)
42
+ if pgroup.nil?
43
+ abort("ERROR: The group '#{pname}' does not exist.")
44
+ end
45
+ fmt.puts 4, "- OK"
46
+
47
+ # Associate parent group with the child groups
48
+
49
+ groups_ds = pgroup.children_dataset
50
+ cnames.each do |cname|
51
+ fmt.puts 2, "- add association {group:#{pname} <-> group:#{cname}}..."
52
+
53
+ # Check against existing associations
54
+ unless groups_ds[name: cname].nil?
55
+ warn_count += 1
56
+ fmt.warn "Association {group:#{pname} <-> group:#{cname}}}"\
57
+ " already exists, skipping.\n"
58
+ fmt.puts 4, '- already exists, skipping.'
59
+ fmt.puts 4, '- OK'
60
+ next
61
+ end
62
+
63
+ # Add new association
64
+ cgroup = db.models[:group].find(name: cname)
65
+ if cgroup.nil?
66
+ warn_count += 1
67
+ fmt.warn "Group '#{cname}' does not exist and will be created.\n"
68
+ fmt.puts 4, '- child group does not exist, creating now...'
69
+ cgroup = db.models[:group].create(name: cname)
70
+ fmt.puts 6, '- OK'
71
+ end
72
+ pgroup.add_child(cgroup)
73
+ fmt.puts 4, '- OK'
74
+ end
75
+ fmt.puts 2, '- all OK'
76
+ end # Transaction end
77
+ rescue db.exceptions[:moose] => e
78
+ abort("ERROR: #{e}")
79
+ end
80
+ if warn_count == 0
81
+ puts 'Succeeded.'
82
+ else
83
+ puts 'Succeeded, with warnings.'
84
+ end
85
+
17
86
  end
18
87
  end
19
88
  end
20
89
  end
21
90
  end
91
+
92
+
@@ -13,7 +13,8 @@ module Moose
13
13
  def addhost(*args) # rubocop:disable Metrics/AbcSize
14
14
  # Sanity
15
15
  if args.length < 2
16
- abort("ERROR: Wrong number of arguments, #{args.length} for 2 or more.")
16
+ abort("ERROR: Wrong number of arguments, #{args.length} "\
17
+ "for 2 or more.")
17
18
  end
18
19
 
19
20
  # Arguments
@@ -29,6 +29,8 @@ module Moose
29
29
  unless group.nil?
30
30
  hosts = group.hosts_dataset.map(:name)
31
31
 
32
+ children = group.children_dataset.map(:name)
33
+
32
34
  groupvars = {}
33
35
  group.groupvars_dataset.each do |gv|
34
36
  groupvars[gv[:name].to_sym] = gv[:value]
@@ -38,6 +40,11 @@ module Moose
38
40
  unless hosts.length == 0
39
41
  results[group[:name].to_sym][:hosts] = hosts
40
42
  end
43
+
44
+ unless children.length == 0
45
+ results[group[:name].to_sym][:children] = children
46
+ end
47
+
41
48
  unless groupvars.length == 0
42
49
  results[group[:name].to_sym][:groupvars] = groupvars
43
50
  end
@@ -23,16 +23,24 @@ module Moose
23
23
 
24
24
  # Hide the automatic ungrouped group, if it's empty
25
25
  next if group[:name] == 'ungrouped' && hosts.length == 0
26
-
26
+
27
+ children = group.children_dataset.map(:name)
28
+
27
29
  groupvars = {}
28
30
  group.groupvars_dataset.each do |gv|
29
31
  groupvars[gv[:name].to_sym] = gv[:value]
30
32
  end
31
33
 
34
+
32
35
  results[group[:name].to_sym] = {}
33
36
  unless hosts.length == 0
34
37
  results[group[:name].to_sym][:hosts] = hosts
35
38
  end
39
+
40
+ unless children.length == 0
41
+ results[group[:name].to_sym][:children] = children
42
+ end
43
+
36
44
  unless groupvars.length == 0
37
45
  if confopts[:ansible] == true
38
46
  results[group[:name].to_sym][:vars] = groupvars
@@ -1,4 +1,5 @@
1
1
  require 'thor'
2
+
2
3
  require_relative './formatter.rb'
3
4
 
4
5
  module Moose
@@ -8,11 +9,72 @@ module Moose
8
9
  # Implemention of the "group rmchild" methods of the CLI
9
10
  class Group < Thor # rubocop:disable ClassLength
10
11
  #==========================
11
- desc 'rmchild NAME CHILDNAME',
12
- 'Dissociate a child-group CHILDNAME from the group NAME'
13
- def rmchild
14
- abort("The 'groups rmchild GROUP' method is not yet implemented")
15
- puts 'group rmchild'
12
+ desc 'rmchild PARENTGROUP CHILDGROUP_1 [CHILDGROUP_2 ... ]',
13
+ 'Dissociate one or more child-groups CHILDGROUP_n from PARENTGROUP'
14
+ def rmchild(*argv)
15
+
16
+ # Sanity check
17
+ if args.length < 2
18
+ abort("ERROR: Wrong number of arguments, #{args.length} "\
19
+ "for 2 or more.")
20
+ end
21
+
22
+ # Arguments
23
+ pname = args[0].downcase
24
+ cnames = args.slice(1, args.length - 1).uniq.map(&:downcase)
25
+
26
+ # Sanity
27
+ if pname == 'ungrouped' || cnames.include?('ungrouped')
28
+ abort("ERROR: Cannot manually manipulate the automatic group 'ungrouped'.")
29
+ end
30
+
31
+ # Convenience
32
+ db = Moose::Inventory::DB
33
+ fmt = Moose::Inventory::Cli::Formatter
34
+
35
+ # Transaction
36
+ warn_count = 0
37
+ begin
38
+ db.transaction do # Transaction start
39
+ puts "Dissociate parent group '#{pname}' from child group(s) '#{cnames.join(',')}':"
40
+ # Get the target group
41
+ fmt.puts 2, "- retrieve group '#{pname}'..."
42
+ pgroup = db.models[:group].find(name: pname)
43
+ if pgroup.nil?
44
+ abort("ERROR: The group '#{pname}' does not exist.")
45
+ end
46
+ fmt.puts 4, "- OK"
47
+
48
+ # Dissociate parent group from the child groups
49
+ groups_ds = pgroup.children_dataset
50
+ cnames.each do |cname|
51
+ fmt.puts 2, "- remove association {group:#{pname} <-> group:#{cname}}..."
52
+
53
+ # Check against existing associations
54
+ if groups_ds[name: cname].nil?
55
+ warn_count += 1
56
+ fmt.warn "Association {group:#{pname} <-> group:#{cname}}"\
57
+ " does not exist, skipping.\n"
58
+ fmt.puts 4, "- doesn't exist, skipping."
59
+ fmt.puts 4, '- OK'
60
+ next
61
+ end
62
+
63
+ # remove association
64
+ cgroup = db.models[:group].find(name: cname)
65
+ pgroup.remove_child(cgroup)
66
+ fmt.puts 4, '- OK'
67
+ end
68
+ fmt.puts 2, '- all OK'
69
+ end # Transaction end
70
+ rescue db.exceptions[:moose] => e
71
+ abort("ERROR: #{e}")
72
+ end
73
+ if warn_count == 0
74
+ puts 'Succeeded.'
75
+ else
76
+ puts 'Succeeded, with warnings.'
77
+ end
16
78
  end
17
79
  end
18
80
  end
@@ -34,9 +34,9 @@ module Moose
34
34
  # long-running code. Personally, I don't like this pooling regime -
35
35
  # perhaps I'm not understanding how it's supposed to be used?
36
36
  #
37
- # TODO: can the models be refreshed, to make then again valid? What if
37
+ # QUESTION: can the models be refreshed, to make then again valid? What if
38
38
  # we "load" instead of "require" the models?
39
- # UPDATE: Nope, still borks even if we use a load.
39
+ # ANSWER: Nope, still borks even if we use a load.
40
40
  #
41
41
  # @db = nil # <- fails for unit tests
42
42
  return unless @db.nil? # <- works for unit tests
@@ -113,6 +113,7 @@ module Moose
113
113
  Group.all.each do |g|
114
114
  g.remove_all_hosts
115
115
  g.remove_all_groupvars
116
+ g.remove_all_children
116
117
  g.destroy
117
118
  end
118
119
 
@@ -153,6 +154,7 @@ module Moose
153
154
  unless @db.table_exists? :groups
154
155
  @db.create_table(:groups) do
155
156
  primary_key :id
157
+ foreign_key :parent_id
156
158
  column :name, :text, unique: true
157
159
  end
158
160
  end
@@ -11,7 +11,8 @@ module Moose
11
11
  ##
12
12
  # Model for the groups table
13
13
  class Group < Sequel::Model
14
- # TODO: Groups of groups? (i.e. a group with children?)
14
+ many_to_one :parent, :class=>self
15
+ one_to_many :children, :key=>:parent_id, :class=>self
15
16
  many_to_many :hosts
16
17
  one_to_many :groupvars
17
18
  end
@@ -2,6 +2,6 @@ module Moose
2
2
  ##
3
3
  # The Moose-Tools dynamic inventory management library
4
4
  module Inventory
5
- VERSION = '0.1.6'
5
+ VERSION = '0.1.7'
6
6
  end
7
7
  end
@@ -0,0 +1,181 @@
1
+ require 'spec_helper'
2
+
3
+ # TODO: the usual respond_to? method doesn't seem to work on Thor objects.
4
+ # Why not? For now, we'll check against instance_methods.
5
+
6
+ RSpec.describe Moose::Inventory::Cli::Group do
7
+ before(:all) do
8
+ # Set up the configuration object
9
+ @mockarg_parts = {
10
+ config: File.join(spec_root, 'config/config.yml'),
11
+ format: 'yaml',
12
+ env: 'test'
13
+ }
14
+
15
+ @mockargs = []
16
+ @mockarg_parts.each do |key, val|
17
+ @mockargs << "--#{key}"
18
+ @mockargs << val
19
+ end
20
+
21
+ @console = Moose::Inventory::Cli::Formatter
22
+
23
+ @config = Moose::Inventory::Config
24
+ @config.init(@mockargs)
25
+
26
+ @db = Moose::Inventory::DB
27
+ @db.init if @db.db.nil?
28
+
29
+ @group = Moose::Inventory::Cli::Group
30
+ @host = Moose::Inventory::Cli::Host
31
+ @app = Moose::Inventory::Cli::Application
32
+ end
33
+
34
+ before(:each) do
35
+ @db.reset
36
+ end
37
+
38
+ #=======================
39
+ describe 'addchild' do
40
+ #------------------------
41
+ it 'Group.addchild() should be responsive' do
42
+ result = @group.instance_methods(false).include?(:addchild)
43
+ expect(result).to eq(true)
44
+ end
45
+
46
+ #------------------------
47
+ it '<missing args> ... should abort with an error' do
48
+ actual = runner do
49
+ @app.start(%w(group addchild))
50
+ end
51
+
52
+ #@console.out(actual, 'y')
53
+
54
+ # Check output
55
+ desired = { aborted: true}
56
+ desired[:STDERR] = "ERROR: Wrong number of arguments, 0 for 2 or more.\n"
57
+ expected(actual, desired)
58
+ end
59
+
60
+ #------------------------
61
+ it 'ungrouped ... should abort with an error' do
62
+ parent_name = "ungrouped"
63
+ child_name = "fake"
64
+
65
+ actual = runner do
66
+ @app.start(%W(group addchild #{parent_name} #{child_name}))
67
+ end
68
+
69
+ #@console.out(actual, 'y')
70
+
71
+ # Check output
72
+ desired = { aborted: true}
73
+ desired[:STDERR] = "ERROR: Cannot manually manipulate the automatic group 'ungrouped'.\n"
74
+ expected(actual, desired)
75
+
76
+ ############################
77
+ # Should work the other way round too, when the child in the ungrouped item
78
+ parent_name = "fake"
79
+ child_name = "ungrouped"
80
+
81
+ actual = runner do
82
+ @app.start(%W(group addchild #{parent_name} #{child_name}))
83
+ end
84
+
85
+ #@console.out(actual, 'y')
86
+
87
+ # Check output
88
+ desired = { aborted: true}
89
+ desired[:STDERR] = "ERROR: Cannot manually manipulate the automatic group 'ungrouped'.\n"
90
+ expected(actual, desired)
91
+
92
+ end
93
+
94
+ #------------------------
95
+ it 'GROUP CHILDGROUP ... should abort if GROUP does not exist' do
96
+ # TODO: Why don't we just create GROUP? Likewise for all similar functions?
97
+
98
+ pname = 'parent_group'
99
+ cname = 'child group'
100
+
101
+ actual = runner do
102
+ @app.start(%W(group addchild #{pname} #{cname}))
103
+ end
104
+
105
+ #@console.out(actual, 'y')
106
+ # Check output
107
+ desired = { aborted: true}
108
+ desired[:STDOUT] =
109
+ "Associate parent group '#{pname}' with child group(s) '#{cname}':\n"\
110
+ " - retrieve group '#{pname}'...\n"
111
+ desired[:STDERR] =
112
+ "ERROR: The group '#{pname}' does not exist.\n"\
113
+ "An error occurred during a transaction, any changes have been rolled back.\n"
114
+ expected(actual, desired)
115
+ end
116
+
117
+ #------------------------
118
+ it 'GROUP CHILDGROUP... should associate GROUP with an existing CHILDGROUP' do
119
+ pname = 'parent_group'
120
+ cname = 'child_group'
121
+
122
+ runner { @app.start(%W(group add #{pname} #{cname})) }
123
+
124
+ actual = runner { @app.start(%W(group addchild #{pname} #{cname} )) }
125
+
126
+ #@console.out(actual, 'y')
127
+
128
+ desired = { aborted: false}
129
+ desired[:STDOUT] =
130
+ "Associate parent group '#{pname}' with child group(s) '#{cname}':\n"\
131
+ " - retrieve group '#{pname}'...\n"\
132
+ " - OK\n"\
133
+ " - add association {group:#{pname} <-> group:#{cname}}...\n"\
134
+ " - OK\n"\
135
+ " - all OK\n"\
136
+ "Succeeded.\n"
137
+ expected(actual, desired)
138
+
139
+ # We should have the correct group associations
140
+ pgroup = @db.models[:group].find(name: pname)
141
+ cgroups = pgroup.children_dataset
142
+ expect(cgroups.count).to eq(1)
143
+ expect(cgroups[name: cname]).not_to be_nil
144
+ end
145
+
146
+ #------------------------
147
+ it 'GROUP CHILDGROUP... should associate GROUP with a CHILDGROUP '\
148
+ 'creating it if necessary' do
149
+ #
150
+ pname = 'parent_group'
151
+ cname = 'child_group'
152
+
153
+ runner { @app.start(%W(group add #{pname})) } # <- don't pre-create the child
154
+
155
+ actual = runner { @app.start(%W(group addchild #{pname} #{cname} )) }
156
+
157
+ #@console.out(actual, 'y')
158
+
159
+ desired = { aborted: false}
160
+ desired[:STDOUT] =
161
+ "Associate parent group '#{pname}' with child group(s) '#{cname}':\n"\
162
+ " - retrieve group '#{pname}'...\n"\
163
+ " - OK\n"\
164
+ " - add association {group:#{pname} <-> group:#{cname}}...\n"\
165
+ " - child group does not exist, creating now...\n"\
166
+ " - OK\n"\
167
+ " - OK\n"\
168
+ " - all OK\n"\
169
+ "Succeeded, with warnings.\n"
170
+ desired[:STDERR] = "WARNING: Group '#{cname}' does not exist and will be created.\n"
171
+ expected(actual, desired)
172
+
173
+ # We should have the correct group associations
174
+ pgroup = @db.models[:group].find(name: pname)
175
+ cgroups = pgroup.children_dataset
176
+ expect(cgroups.count).to eq(1)
177
+ expect(cgroups[name: cname]).not_to be_nil
178
+ end
179
+
180
+ end
181
+ end
@@ -0,0 +1,177 @@
1
+ require 'spec_helper'
2
+
3
+ # TODO: the usual respond_to? method doesn't seem to work on Thor objects.
4
+ # Why not? For now, we'll check against instance_methods.
5
+
6
+ RSpec.describe Moose::Inventory::Cli::Group do
7
+ before(:all) do
8
+ # Set up the configuration object
9
+ @mockarg_parts = {
10
+ config: File.join(spec_root, 'config/config.yml'),
11
+ format: 'yaml',
12
+ env: 'test'
13
+ }
14
+
15
+ @mockargs = []
16
+ @mockarg_parts.each do |key, val|
17
+ @mockargs << "--#{key}"
18
+ @mockargs << val
19
+ end
20
+
21
+ @console = Moose::Inventory::Cli::Formatter
22
+
23
+ @config = Moose::Inventory::Config
24
+ @config.init(@mockargs)
25
+
26
+ @db = Moose::Inventory::DB
27
+ @db.init if @db.db.nil?
28
+
29
+ @group = Moose::Inventory::Cli::Group
30
+ @host = Moose::Inventory::Cli::Host
31
+ @app = Moose::Inventory::Cli::Application
32
+ end
33
+
34
+ before(:each) do
35
+ @db.reset
36
+ end
37
+
38
+ #=======================
39
+ describe 'rmchild' do
40
+ #------------------------
41
+ it 'Group.rmchild() should be responsive' do
42
+ result = @group.instance_methods(false).include?(:rmchild)
43
+ expect(result).to eq(true)
44
+ end
45
+
46
+ #------------------------
47
+ it '<missing args> ... should abort with an error' do
48
+ actual = runner do
49
+ @app.start(%w(group addchild))
50
+ end
51
+
52
+ #@console.out(actual, 'y')
53
+
54
+ # Check output
55
+ desired = { aborted: true}
56
+ desired[:STDERR] = "ERROR: Wrong number of arguments, 0 for 2 or more.\n"
57
+ expected(actual, desired)
58
+ end
59
+
60
+ #------------------------
61
+ it 'ungrouped ... should abort with an error' do
62
+ parent_name = "ungrouped"
63
+ child_name = "fake"
64
+
65
+ actual = runner do
66
+ @app.start(%W(group addchild #{parent_name} #{child_name}))
67
+ end
68
+
69
+ #@console.out(actual, 'y')
70
+
71
+ # Check output
72
+ desired = { aborted: true}
73
+ desired[:STDERR] = "ERROR: Cannot manually manipulate the automatic group 'ungrouped'.\n"
74
+ expected(actual, desired)
75
+
76
+ ############################
77
+ # Should work the other way round too, when the child in the ungrouped item
78
+ parent_name = "fake"
79
+ child_name = "ungrouped"
80
+
81
+ actual = runner do
82
+ @app.start(%W(group rmchild #{parent_name} #{child_name}))
83
+ end
84
+
85
+ #@console.out(actual, 'y')
86
+
87
+ # Check output
88
+ desired = { aborted: true}
89
+ desired[:STDERR] = "ERROR: Cannot manually manipulate the automatic group 'ungrouped'.\n"
90
+ expected(actual, desired)
91
+
92
+ end
93
+
94
+ #------------------------
95
+ it 'GROUP CHILDGROUP ... should abort if GROUP does not exist' do
96
+
97
+ pname = 'parent_group'
98
+ cname = 'child group'
99
+
100
+ actual = runner do
101
+ @app.start(%W(group rmchild #{pname} #{cname}))
102
+ end
103
+
104
+ #@console.out(actual, 'y')
105
+ # Check output
106
+ desired = { aborted: true}
107
+ desired[:STDOUT] =
108
+ "Dissociate parent group '#{pname}' from child group(s) '#{cname}':\n"\
109
+ " - retrieve group '#{pname}'...\n"
110
+ desired[:STDERR] =
111
+ "ERROR: The group '#{pname}' does not exist.\n"\
112
+ "An error occurred during a transaction, any changes have been rolled back.\n"
113
+ expected(actual, desired)
114
+ end
115
+
116
+ #------------------------
117
+ it 'GROUP CHILDGROUP ... should succeed with warnings if CHILDGROUP is not associated' do
118
+
119
+ pname = 'parent_group'
120
+ cname = 'child group'
121
+
122
+ runner { @app.start(%W(group add #{pname} #{cname})) }
123
+
124
+ actual = runner do
125
+ @app.start(%W(group rmchild #{pname} #{cname}))
126
+ end
127
+
128
+ #@console.out(actual, 'y')
129
+
130
+ # Check output
131
+ desired = {}
132
+ desired[:STDOUT] =
133
+ "Dissociate parent group '#{pname}' from child group(s) '#{cname}':\n"\
134
+ " - retrieve group '#{pname}'...\n"\
135
+ " - OK\n"\
136
+ " - remove association {group:#{pname} <-> group:#{cname}}...\n"\
137
+ " - doesn't exist, skipping.\n"\
138
+ " - OK\n"\
139
+ " - all OK\n"\
140
+ "Succeeded, with warnings.\n"
141
+
142
+ desired[:STDERR] =
143
+ "WARNING: Association {group:#{pname} <-> group:#{cname}} does not exist, skipping.\n"
144
+
145
+ expected(actual, desired)
146
+ end
147
+
148
+ #------------------------
149
+ it 'GROUP CHILDGROUP ... should succeed without warnings if CHILDGROUP is associated' do
150
+
151
+ pname = 'parent_group'
152
+ cname = 'child group'
153
+
154
+ runner { @app.start(%W(group add #{pname} #{cname})) }
155
+ runner { @app.start(%W(group addchild #{pname} #{cname})) }
156
+
157
+ actual = runner do
158
+ @app.start(%W(group rmchild #{pname} #{cname}))
159
+ end
160
+
161
+ #@console.out(actual, 'y')
162
+
163
+ # Check output
164
+ desired = {}
165
+ desired[:STDOUT] =
166
+ "Dissociate parent group '#{pname}' from child group(s) '#{cname}':\n"\
167
+ " - retrieve group '#{pname}'...\n"\
168
+ " - OK\n"\
169
+ " - remove association {group:#{pname} <-> group:#{cname}}...\n"\
170
+ " - OK\n"\
171
+ " - all OK\n"\
172
+ "Succeeded.\n"
173
+
174
+ expected(actual, desired)
175
+ end
176
+ end
177
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moose-inventory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Russell Davies
@@ -309,12 +309,14 @@ files:
309
309
  - spec/lib/moose_inventory/cli/cli_spec.rb
310
310
  - spec/lib/moose_inventory/cli/formatter_spec.rb
311
311
  - spec/lib/moose_inventory/cli/group_add_spec.rb
312
+ - spec/lib/moose_inventory/cli/group_addchild_spec.rb
312
313
  - spec/lib/moose_inventory/cli/group_addhost_spec.rb
313
314
  - spec/lib/moose_inventory/cli/group_addvar_spec.rb
314
315
  - spec/lib/moose_inventory/cli/group_get_spec.rb
315
316
  - spec/lib/moose_inventory/cli/group_list_spec.rb
316
317
  - spec/lib/moose_inventory/cli/group_listvar_spec.rb
317
318
  - spec/lib/moose_inventory/cli/group_rm_spec.rb
319
+ - spec/lib/moose_inventory/cli/group_rmchild_spec.rb
318
320
  - spec/lib/moose_inventory/cli/group_rmhost_spec.rb
319
321
  - spec/lib/moose_inventory/cli/group_rmvar_spec.rb
320
322
  - spec/lib/moose_inventory/cli/group_spec.rb
@@ -363,12 +365,14 @@ test_files:
363
365
  - spec/lib/moose_inventory/cli/cli_spec.rb
364
366
  - spec/lib/moose_inventory/cli/formatter_spec.rb
365
367
  - spec/lib/moose_inventory/cli/group_add_spec.rb
368
+ - spec/lib/moose_inventory/cli/group_addchild_spec.rb
366
369
  - spec/lib/moose_inventory/cli/group_addhost_spec.rb
367
370
  - spec/lib/moose_inventory/cli/group_addvar_spec.rb
368
371
  - spec/lib/moose_inventory/cli/group_get_spec.rb
369
372
  - spec/lib/moose_inventory/cli/group_list_spec.rb
370
373
  - spec/lib/moose_inventory/cli/group_listvar_spec.rb
371
374
  - spec/lib/moose_inventory/cli/group_rm_spec.rb
375
+ - spec/lib/moose_inventory/cli/group_rmchild_spec.rb
372
376
  - spec/lib/moose_inventory/cli/group_rmhost_spec.rb
373
377
  - spec/lib/moose_inventory/cli/group_rmvar_spec.rb
374
378
  - spec/lib/moose_inventory/cli/group_spec.rb