linux_admin 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -25,6 +25,30 @@ class LinuxAdmin
25
25
  val.to_f.gigabytes
26
26
  end
27
27
  end
28
+
29
+ def overlapping_ranges?(ranges)
30
+ ranges.find do |range1|
31
+ ranges.any? do |range2|
32
+ range1 != range2 &&
33
+ range1.overlaps?(range2)
34
+ end
35
+ end
36
+ end
37
+
38
+ def check_if_partitions_overlap(partitions)
39
+ ranges =
40
+ partitions.collect do |partition|
41
+ start = partition[:start]
42
+ finish = partition[:end]
43
+ start.delete('%')
44
+ finish.delete('%')
45
+ start.to_f..finish.to_f
46
+ end
47
+
48
+ if overlapping_ranges?(ranges)
49
+ raise ArgumentError, "overlapping partitions"
50
+ end
51
+ end
28
52
 
29
53
  public
30
54
 
@@ -109,27 +133,46 @@ class LinuxAdmin
109
133
  result_indicates_partition_table?(result)
110
134
  end
111
135
 
112
- def create_partition(partition_type, size)
136
+ def create_partition(partition_type, *args)
113
137
  create_partition_table unless has_partition_table?
114
138
 
115
- id, start =
116
- partitions.empty? ? [1, 0] :
117
- [(partitions.last.id + 1),
118
- partitions.last.end_sector]
139
+ start = finish = size = nil
140
+ case args.length
141
+ when 1 then
142
+ start = partitions.empty? ? 0 : partitions.last.end_sector
143
+ size = args.first
144
+ finish = start + size
145
+
146
+ when 2 then
147
+ start = args[0]
148
+ finish = args[1]
149
+
150
+ else
151
+ raise ArgumentError, "must specify start/finish or size"
152
+ end
119
153
 
120
- options = parted_options_array('mkpart', partition_type, start, start + size)
154
+ id = partitions.empty? ? 1 : (partitions.last.id + 1)
155
+ options = parted_options_array('mkpart', '-a opt', partition_type, start, finish)
121
156
  run!(cmd(:parted), :params => { nil => options})
122
157
 
123
158
  partition = Partition.new(:disk => self,
124
159
  :id => id,
125
160
  :start_sector => start,
126
- :end_sector => start+size,
161
+ :end_sector => finish,
127
162
  :size => size,
128
163
  :partition_type => partition_type)
129
164
  partitions << partition
130
165
  partition
131
166
  end
132
167
 
168
+ def create_partitions(partition_type, *args)
169
+ check_if_partitions_overlap(args)
170
+
171
+ args.each { |arg|
172
+ self.create_partition(partition_type, arg[:start], arg[:end])
173
+ }
174
+ end
175
+
133
176
  def clear!
134
177
  @partitions = []
135
178
 
@@ -33,19 +33,24 @@ class LinuxAdmin
33
33
  end
34
34
 
35
35
  def subscribe(options)
36
- raise ArgumentError, "pools, username and password are required" if options[:pools].blank? || options[:username].blank? || options[:password].blank?
36
+ raise ArgumentError, "channels, username and password are required" if options[:channels].blank? || options[:username].blank? || options[:password].blank?
37
37
  cmd = "rhn-channel -a"
38
38
 
39
- pools = options[:pools].collect {|pool| ["--channel=", pool]}
39
+ channels = options[:channels].collect {|channel| ["--channel=", channel]}
40
40
 
41
41
  params = {}
42
42
  params["--user="] = options[:username]
43
43
  params["--password="] = options[:password]
44
- params = params.to_a + pools
44
+ params = params.to_a + channels
45
45
 
46
46
  run!(cmd, :params => params)
47
47
  end
48
48
 
49
+ def subscribed_products
50
+ cmd = "rhn-channel -l"
51
+ run!(cmd).output.split("\n").compact
52
+ end
53
+
49
54
  private
50
55
 
51
56
  def systemid_file
@@ -47,12 +47,25 @@ class LinuxAdmin
47
47
 
48
48
  def subscribe(options)
49
49
  cmd = "subscription-manager attach"
50
- pools = options[:pools].collect {|pool| ["--pool", pool]}
51
- params = proxy_params(options).to_a + pools
50
+ params = proxy_params(options)
51
+
52
+ if options[:pools].blank?
53
+ params.merge!({"--auto" => nil})
54
+ else
55
+ pools = options[:pools].collect {|pool| ["--pool", pool]}
56
+ params = params.to_a + pools
57
+ end
52
58
 
53
59
  run!(cmd, :params => params)
54
60
  end
55
61
 
62
+ def subscribed_products
63
+ cmd = "subscription-manager list --installed"
64
+ output = run!(cmd).output
65
+
66
+ parse_output(output).select {|p| p[:status].downcase == "subscribed"}.collect {|p| p[:product_id]}
67
+ end
68
+
56
69
  def available_subscriptions
57
70
  cmd = "subscription-manager list --all --available"
58
71
  output = run!(cmd).output
@@ -80,7 +93,8 @@ class LinuxAdmin
80
93
  end
81
94
 
82
95
  def format_values(content_group)
83
- content_group[:ends] = Date.strptime(content_group[:ends], "%m/%d/%Y") if content_group[:ends]
96
+ content_group[:ends] = Date.strptime(content_group[:ends], "%m/%d/%Y") if content_group[:ends]
97
+ content_group[:starts] = Date.strptime(content_group[:starts], "%m/%d/%Y") if content_group[:starts]
84
98
  content_group
85
99
  end
86
100
 
@@ -1,3 +1,3 @@
1
1
  class LinuxAdmin
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -66,10 +66,9 @@ class LinuxAdmin
66
66
 
67
67
  out = run!(cmd, :params => params).output
68
68
 
69
- items = out.split("\n")
70
- items.each_with_object({}) do |i, versions|
71
- name, version = i.split(" ", 2)
72
- versions[name.strip] = version.strip
69
+ out.split("\n").each_with_object({}) do |i, versions|
70
+ name, version = i.split(" ", 2)
71
+ versions[name.strip] = version.strip
73
72
  end
74
73
  end
75
74
 
@@ -0,0 +1,2 @@
1
+ rhel-x86_64-server-6
2
+ rhel-x86_64-server-6-cf-me-2
@@ -0,0 +1,19 @@
1
+ +-------------------------------------------+
2
+ Installed Product Status
3
+ +-------------------------------------------+
4
+ Product Name: Red Hat Enterprise Linux Server
5
+ Product ID: 69
6
+ Version: 6.3
7
+ Arch: x86_64
8
+ Status: Not Subscribed
9
+ Starts: 09/27/2012
10
+ Ends: 09/26/2013
11
+
12
+ Product Name: Red Hat CloudForms
13
+ Product ID: 167
14
+ Version: 2.1
15
+ Arch: x86_64
16
+ Status: Subscribed
17
+ Starts: 01/03/2013
18
+ Ends: 01/03/2014
19
+
@@ -0,0 +1,19 @@
1
+ +-------------------------------------------+
2
+ Installed Product Status
3
+ +-------------------------------------------+
4
+ Product Name: Red Hat Enterprise Linux Server
5
+ Product ID: 69
6
+ Version: 6.3
7
+ Arch: x86_64
8
+ Status: Subscribed
9
+ Starts: 09/27/2012
10
+ Ends: 09/26/2013
11
+
12
+ Product Name: Red Hat CloudForms
13
+ Product ID: 167
14
+ Version: 2.1
15
+ Arch: x86_64
16
+ Status: Subscribed
17
+ Starts: 01/03/2013
18
+ Ends: 01/03/2014
19
+
@@ -0,0 +1 @@
1
+ subscription-manager 1.1.23.1
data/spec/disk_spec.rb CHANGED
@@ -99,6 +99,35 @@ eos
99
99
  end
100
100
  end
101
101
 
102
+ describe "#create_partitions" do
103
+ before(:each) do
104
+ @disk = LinuxAdmin::Disk.new(:path => '/dev/hda')
105
+ end
106
+
107
+ it "dispatches to create_partition" do
108
+ @disk.should_receive(:create_partition).with("primary", "0%", "50%")
109
+ @disk.create_partitions "primary", :start => "0%", :end => "50%"
110
+ end
111
+
112
+ context "multiple partitions specified" do
113
+ it "calls create_partition for each partition" do
114
+ @disk.should_receive(:create_partition).with("primary", "0%", "49%")
115
+ @disk.should_receive(:create_partition).with("primary", "50%", "100%")
116
+ @disk.create_partitions("primary", {:start => "0%", :end => "49%"},
117
+ {:start => "50%", :end => "100%"})
118
+ end
119
+
120
+ context "partitions overlap" do
121
+ it "raises argument error" do
122
+ expect{
123
+ @disk.create_partitions("primary", {:start => "0%", :end => "50%"},
124
+ {:start => "49%", :end => "100%"})
125
+ }.to raise_error(ArgumentError)
126
+ end
127
+ end
128
+ end
129
+ end
130
+
102
131
  describe "#create_partition" do
103
132
  before(:each) do
104
133
  # test disk w/ existing partition
@@ -110,12 +139,29 @@ eos
110
139
  end
111
140
 
112
141
  it "uses parted" do
113
- @disk.should_receive(:run!).
114
- with(@disk.cmd(:parted),
115
- :params => { nil => ['--script', '/dev/hda', 'mkpart', 'primary', 1024, 2048] })
142
+ params = ['--script', '/dev/hda', 'mkpart', '-a opt', 'primary', 1024, 2048]
143
+ @disk.should_receive(:run!).with(@disk.cmd(:parted), :params => { nil => params })
116
144
  @disk.create_partition 'primary', 1024
117
145
  end
118
146
 
147
+ it "accepts start/end params" do
148
+ params = ['--script', '/dev/hda', 'mkpart', '-a opt', 'primary', "0%", "50%"]
149
+ @disk.should_receive(:run!).with(@disk.cmd(:parted), :params => { nil => params })
150
+ @disk.create_partition 'primary', "0%", "50%"
151
+ end
152
+
153
+ context "missing params" do
154
+ it "raises ArgumentError" do
155
+ expect{
156
+ @disk.create_partition 'primary'
157
+ }.to raise_error(ArgumentError)
158
+
159
+ expect{
160
+ @disk.create_partition 'primary', '0%', '50%', 100
161
+ }.to raise_error(ArgumentError)
162
+ end
163
+ end
164
+
119
165
  it "returns partition" do
120
166
  @disk.should_receive(:run!) # stub out call to parted
121
167
  partition = @disk.create_partition 'primary', 1024
data/spec/rhn_spec.rb CHANGED
@@ -52,13 +52,18 @@ describe LinuxAdmin::Rhn do
52
52
  expect { described_class.new.subscribe({}) }.to raise_error(ArgumentError)
53
53
  end
54
54
 
55
- it "with pools" do
55
+ it "with channels" do
56
56
  described_class.any_instance.should_receive(:run!).once.with("rhn-channel -a", {:params=>[["--user=", "SomeUser"], ["--password=", "SomePass"], ["--channel=", 123], ["--channel=", 456]]})
57
57
  described_class.new.subscribe({
58
58
  :username => "SomeUser",
59
59
  :password => "SomePass",
60
- :pools => [123, 456]
60
+ :channels => [123, 456]
61
61
  })
62
62
  end
63
63
  end
64
+
65
+ it "#subscribed_products" do
66
+ described_class.any_instance.should_receive(:run!).once.with("rhn-channel -l").and_return(double(:output => sample_output("rhn/output_rhn-channel_list")))
67
+ expect(described_class.new.subscribed_products).to eq(["rhel-x86_64-server-6", "rhel-x86_64-server-6-cf-me-2"])
68
+ end
64
69
  end
@@ -24,10 +24,10 @@ describe LinuxAdmin::SubscriptionManager do
24
24
  end
25
25
 
26
26
  it "with username and password" do
27
- run_options = ["subscription-manager register", {:params=>{"--username="=>"SomeUser", "--password="=>"SomePass", "--org="=>"IT", "--proxy="=>"1.2.3.4", "--proxyuser="=>"ProxyUser", "--proxypassword="=>"ProxyPass", "--serverurl="=>"192.168.1.1"}}]
27
+ run_options = ["subscription-manager register", {:params=>{"--username="=>"SomeUser@SomeDomain.org", "--password="=>"SomePass", "--org="=>"IT", "--proxy="=>"1.2.3.4", "--proxyuser="=>"ProxyUser", "--proxypassword="=>"ProxyPass", "--serverurl="=>"192.168.1.1"}}]
28
28
  described_class.any_instance.should_receive(:run!).once.with(*run_options)
29
29
  described_class.new.register(
30
- :username => "SomeUser",
30
+ :username => "SomeUser@SomeDomain.org",
31
31
  :password => "SomePass",
32
32
  :org => "IT",
33
33
  :proxy_address => "1.2.3.4",
@@ -38,9 +38,28 @@ describe LinuxAdmin::SubscriptionManager do
38
38
  end
39
39
  end
40
40
 
41
- it "#subscribe" do
42
- described_class.any_instance.should_receive(:run!).once.with("subscription-manager attach", {:params=>[["--pool", 123], ["--pool", 456]]})
43
- described_class.new.subscribe({:pools => [123, 456]})
41
+ context "#subscribe" do
42
+ it "with pools" do
43
+ described_class.any_instance.should_receive(:run!).once.with("subscription-manager attach", {:params=>[["--pool", 123], ["--pool", 456]]})
44
+ described_class.new.subscribe({:pools => [123, 456]})
45
+ end
46
+
47
+ it "without pools" do
48
+ described_class.any_instance.should_receive(:run!).once.with("subscription-manager attach --auto", {:params=>{}})
49
+ described_class.new.subscribe({})
50
+ end
51
+ end
52
+
53
+ context "#subscribed_products" do
54
+ it "subscribed" do
55
+ described_class.any_instance.should_receive(:run!).once.with("subscription-manager list --installed").and_return(double(:output => sample_output("subscription_manager/output_list_installed_subscribed")))
56
+ expect(described_class.new.subscribed_products).to eq(["69", "167"])
57
+ end
58
+
59
+ it "not subscribed" do
60
+ described_class.any_instance.should_receive(:run!).once.with("subscription-manager list --installed").and_return(double(:output => sample_output("subscription_manager/output_list_installed_not_subscribed")))
61
+ expect(described_class.new.subscribed_products).to eq(["167"])
62
+ end
44
63
  end
45
64
 
46
65
  it "#available_subscriptions" do
data/spec/yum_spec.rb CHANGED
@@ -110,9 +110,14 @@ describe LinuxAdmin::Yum do
110
110
  expect { described_class.version_available }.to raise_error(ArgumentError)
111
111
  end
112
112
 
113
- it "with packages" do
114
- described_class.should_receive(:run!).once.with("repoquery --qf=\"%{name} %{version}\"", {:params=>{nil=>["curl"]}}).and_return(double(:output => sample_output("yum/output_repoquery")))
115
- expect(described_class.version_available("curl")).to eq({
113
+ it "with one package" do
114
+ described_class.should_receive(:run!).once.with("repoquery --qf=\"%{name} %{version}\"", {:params=>{nil=>["subscription-manager"]}}).and_return(double(:output => sample_output("yum/output_repoquery_single")))
115
+ expect(described_class.version_available("subscription-manager")).to eq({"subscription-manager" => "1.1.23.1"})
116
+ end
117
+
118
+ it "with multiple packages" do
119
+ described_class.should_receive(:run!).once.with("repoquery --qf=\"%{name} %{version}\"", {:params=>{nil=>["curl", "subscription-manager", "wget"]}}).and_return(double(:output => sample_output("yum/output_repoquery_multiple")))
120
+ expect(described_class.version_available("curl", "subscription-manager", "wget")).to eq({
116
121
  "curl" => "7.19.7",
117
122
  "subscription-manager" => "1.1.23.1",
118
123
  "wget" => "1.12"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linux_admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2013-09-06 00:00:00.000000000 Z
15
+ date: 2013-09-20 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: bundler
@@ -189,13 +189,17 @@ files:
189
189
  - lib/linux_admin/yum.rb
190
190
  - linux_admin.gemspec
191
191
  - spec/common_spec.rb
192
+ - spec/data/rhn/output_rhn-channel_list
192
193
  - spec/data/rhn/systemid
193
194
  - spec/data/rhn/systemid.missing_system_id
194
195
  - spec/data/rpm/cmd_output_for_list_installed
195
196
  - spec/data/subscription_manager/output_list_all_available
197
+ - spec/data/subscription_manager/output_list_installed_not_subscribed
198
+ - spec/data/subscription_manager/output_list_installed_subscribed
196
199
  - spec/data/subscription_manager/output_orgs
197
200
  - spec/data/yum/first.repo
198
- - spec/data/yum/output_repoquery
201
+ - spec/data/yum/output_repoquery_multiple
202
+ - spec/data/yum/output_repoquery_single
199
203
  - spec/data/yum/second.repo
200
204
  - spec/disk_spec.rb
201
205
  - spec/distro_spec.rb
@@ -240,13 +244,17 @@ specification_version: 3
240
244
  summary: LinuxAdmin is a module to simplify management of linux systems.
241
245
  test_files:
242
246
  - spec/common_spec.rb
247
+ - spec/data/rhn/output_rhn-channel_list
243
248
  - spec/data/rhn/systemid
244
249
  - spec/data/rhn/systemid.missing_system_id
245
250
  - spec/data/rpm/cmd_output_for_list_installed
246
251
  - spec/data/subscription_manager/output_list_all_available
252
+ - spec/data/subscription_manager/output_list_installed_not_subscribed
253
+ - spec/data/subscription_manager/output_list_installed_subscribed
247
254
  - spec/data/subscription_manager/output_orgs
248
255
  - spec/data/yum/first.repo
249
- - spec/data/yum/output_repoquery
256
+ - spec/data/yum/output_repoquery_multiple
257
+ - spec/data/yum/output_repoquery_single
250
258
  - spec/data/yum/second.repo
251
259
  - spec/disk_spec.rb
252
260
  - spec/distro_spec.rb