3
3
4
4
class Chef
5
5
class Resource
6
- # Missing top-level class documentation comment
6
+ # Missing top-level class documentation comment.
7
7
class SupermarketServer < Chef ::Resource
8
+ attr_accessor :exists , :supermarket_version
9
+
8
10
def initialize ( name , run_context = nil )
9
11
super
10
12
@resource_name = :supermarket_server
11
13
@provider = Chef ::Provider ::SupermarketServer
12
- @action = :create
13
- @allowed_actions = [ :create ]
14
+ @allowed_actions = [ :create , :upgrade , :reconfigure ]
15
+ @default_action = :create
14
16
end
15
17
16
18
def chef_server_url ( arg = nil )
@@ -29,6 +31,18 @@ def chef_oauth2_verify_ssl(arg = nil)
29
31
set_or_return ( :chef_oauth2_verify_ssl , arg , kind_of : [ TrueClass , FalseClass ] , required : true )
30
32
end
31
33
34
+ def reconfig_after_upgrades ( arg = nil )
35
+ set_or_return ( :reconfig_after_upgrades , arg , kind_of : [ TrueClass , FalseClass ] , required : true )
36
+ end
37
+
38
+ def restart_after_upgrades ( arg = nil )
39
+ set_or_return ( :restart_after_upgrades , arg , kind_of : [ TrueClass , FalseClass ] , required : true )
40
+ end
41
+
42
+ def supermarket_version ( arg = nil )
43
+ set_or_return ( :supermarket_version , arg , kind_of : [ String , Symbol ] , required : true )
44
+ end
45
+
32
46
def config ( arg = nil )
33
47
set_or_return ( :config , arg , kind_of : [ Hash ] )
34
48
end
@@ -38,18 +52,57 @@ def config(arg = nil)
38
52
39
53
class Chef
40
54
class Provider
41
- # Missing top-level class documentation comment
55
+ # Missing top-level class documentation comment.
42
56
class SupermarketServer < Chef ::Provider ::LWRPBase
57
+ SUPERMARKET_VERSION_FILE = '/opt/supermarket/version-manifest.json' . freeze
58
+ SUPERMARKET_CONFIG = '/etc/supermarket/supermarket.json' . freeze
59
+
43
60
use_inline_resources if defined? ( use_inline_resources )
44
61
45
62
def whyrun_supported?
46
63
true
47
64
end
48
65
66
+ def load_current_resource
67
+ @current_resource = Chef ::Resource ::SupermarketServer . new ( @new_resource . name )
68
+ load_version
69
+ Chef ::Log . info ( "Current version: #{ @current_resource . supermarket_version } " )
70
+ Chef ::Log . info ( "Requested version: #{ @new_resource . supermarket_version } " )
71
+ @current_resource
72
+ end
73
+
74
+ def load_version
75
+ require 'json'
76
+ version_manifest = JSON . parse ( ::File . read ( SUPERMARKET_VERSION_FILE ) )
77
+ @current_resource . supermarket_version = version_manifest [ 'software' ] [ 'supermarket' ] [ 'described_version' ]
78
+ @current_resource . exists = ::File . exist? ( SUPERMARKET_CONFIG ) && ::File . exist? ( SUPERMARKET_VERSION_FILE )
79
+ rescue
80
+ @current_resource . exists = false
81
+ @current_resource . supermarket_version = nil
82
+ end
83
+
84
+ def action_reconfigure
85
+ execute 'reconfigure_supermarket_instance' do
86
+ command 'sudo supermarket-ctl reconfigure'
87
+ only_if { new_resource . reconfig_after_upgrades }
88
+ end
89
+
90
+ execute 'restart_supermarket_instance' do
91
+ command 'sudo supermarket-ctl restart'
92
+ only_if { new_resource . restart_after_upgrades }
93
+ end
94
+ end
95
+
96
+ def can_upgrade? ( vnow , vnext )
97
+ return true if vnow . nil? && vnext == :latest
98
+ Gem ::Version . new ( vnext ) > Gem ::Version . new ( vnow )
99
+ rescue
100
+ Chef ::Log . warn ( "Cannot upgrade. Please set `node['supermarket_omnibus']['package_version']` to a semantic version." )
101
+ false
102
+ end
103
+
49
104
def supermarket_config
50
105
{
51
- 'chef_server_url' => new_resource . chef_server_url ,
52
- 'chef_oauth2_app_id' => new_resource . chef_oauth2_app_id ,
53
106
'chef_oauth2_secret' => new_resource . chef_oauth2_secret ,
54
107
'chef_oauth2_verify_ssl' => new_resource . chef_oauth2_verify_ssl
55
108
}
@@ -59,7 +112,13 @@ def merged_supermarket_config
59
112
new_resource . config . merge ( supermarket_config )
60
113
end
61
114
62
- action :create do
115
+ def action_upgrade
116
+ return unless can_upgrade? ( @current_resource . supermarket_version , new_resource . supermarket_version )
117
+ action_create
118
+ action_reconfigure if @current_resource . exists
119
+ end
120
+
121
+ def action_create
63
122
hostsfile_entry node [ 'ipaddress' ] do
64
123
hostname node [ 'hostname' ]
65
124
not_if "grep #{ node [ 'hostname' ] } /etc/hosts"
@@ -107,7 +166,7 @@ def merged_supermarket_config
107
166
package_source cache_path
108
167
else
109
168
Chef ::Log . info "Using CHEF's public repository #{ node [ 'supermarket_omnibus' ] [ 'package_repo' ] } "
110
- version node [ 'supermarket_omnibus' ] [ 'package_version' ]
169
+ version new_resource . supermarket_version
111
170
end
112
171
end
113
172
end
0 commit comments