Skip to content

Commit 4d7769b

Browse files
committed
JBDS-4174 Install vagrant/virtualbox on macos
1 parent d62784a commit 4d7769b

14 files changed

Lines changed: 128 additions & 150 deletions

File tree

browser/model/cdk.js

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -96,21 +96,7 @@ class CDKInstall extends InstallableItem {
9696
}
9797
}
9898

99-
install(progress, success, failure) {
100-
if(!this.getInstallAfter() || this.getInstallAfter().isInstalled()) {
101-
this.postVagrantInstall(progress, success, failure);
102-
} else {
103-
let name = this.getInstallAfter().productName;
104-
progress.setStatus(`Waiting for ${name} to finish installation`);
105-
this.ipcRenderer.on('installComplete', (event, arg) => {
106-
if (!this.isInstalled() &&arg === this.getInstallAfter().keyName) {
107-
this.postVagrantInstall(progress, success, failure);
108-
}
109-
});
110-
}
111-
}
112-
113-
postVagrantInstall(progress, success, failure) {
99+
installAfterRequirements(progress, success, failure) {
114100
progress.setStatus('Installing');
115101
let installer = new Installer(CDKInstall.KEY, progress, success, failure);
116102

browser/model/cygwin.js

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,21 +53,7 @@ class CygwinInstall extends InstallableItem {
5353
}
5454
}
5555

56-
install(progress, success, failure) {
57-
if( !this.getInstallAfter() || this.getInstallAfter().isInstalled() ) {
58-
this.postVirtualboxInstall(progress, success, failure);
59-
} else {
60-
let name = this.getInstallAfter().productName;
61-
progress.setStatus(`Waiting for ${name} to finish installation`);
62-
this.ipcRenderer.on('installComplete', (event, arg) => {
63-
if (!this.isInstalled() && arg === this.getInstallAfter().keyName) {
64-
this.postVirtualboxInstall(progress, success, failure);
65-
}
66-
});
67-
}
68-
}
69-
70-
postVirtualboxInstall(progress, success, failure) {
56+
installAfterRequirements(progress, success, failure) {
7157
progress.setStatus('Installing');
7258
let installer = new Installer(CygwinInstall.KEY, progress, success, failure);
7359

browser/model/installable-item.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,17 @@ class InstallableItem {
163163
}
164164

165165
install(progress, success, failure) {
166-
// To be overridden
167-
success();
166+
if( !this.getInstallAfter() || this.getInstallAfter().isInstalled() ) {
167+
this.installAfterRequirements(progress, success, failure);
168+
} else {
169+
let name = this.getInstallAfter().productName;
170+
progress.setStatus(`Waiting for ${name} to finish installation`);
171+
this.ipcRenderer.on('installComplete', (event, arg) => {
172+
if (!this.isInstalled() && arg === this.getInstallAfter().keyName) {
173+
this.installAfterRequirements(progress, success, failure);
174+
}
175+
});
176+
}
168177
}
169178

170179
setup(progress, success, failure) {

browser/model/jbds.js

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -108,21 +108,7 @@ class JbdsInstall extends InstallableItem {
108108
});
109109
}
110110

111-
install(progress, success, failure) {
112-
if ( !this.getInstallAfter() || this.getInstallAfter().isInstalled() ) {
113-
this.postInstall(progress, success, failure);
114-
} else {
115-
let name = this.getInstallAfter().productName;
116-
progress.setStatus(`Waiting for ${name} to finish installation`);
117-
this.ipcRenderer.on('installComplete', (event, arg) => {
118-
if(!this.isInstalled() && arg === this.getInstallAfter().keyName) {
119-
this.postInstall(progress, success, failure);
120-
}
121-
});
122-
}
123-
}
124-
125-
postInstall(progress, success, failure) {
111+
installAfterRequirements(progress, success, failure) {
126112
progress.setStatus('Installing');
127113
if(this.selectedOption === 'install') {
128114
this.installGenerator = new JbdsAutoInstallGenerator(this.installerDataSvc.jbdsDir(), this.installerDataSvc.jdkDir(), this.version);

browser/model/jdk-install.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ class JdkInstall extends InstallableItem {
133133
return 'jdk';
134134
}
135135

136-
install(progress, success, failure) {
136+
installAfterRequirements(progress, success, failure) {
137137
if(this.selectedOption === 'install') {
138138
progress.setStatus('Installing');
139139
let installer = new Installer(JdkInstall.KEY, progress, success, failure);
@@ -200,8 +200,8 @@ class JdkInstall extends InstallableItem {
200200
}
201201

202202
renameFile(folder, oldName, newName) {
203-
let filePath = path.join(folder, oldName)
204-
Logger.info(JdkInstall.KEY + ' - Rename ' + filePath + 'to ' + newName)
203+
let filePath = path.join(folder, oldName);
204+
Logger.info(JdkInstall.KEY + ' - Rename ' + filePath + 'to ' + newName);
205205
return new Promise(function (resolve, reject) {
206206
fs.rename(filePath, newName, function(err) {
207207
if (err) {

browser/model/vagrant.js

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class VagrantInstall extends InstallableItem {
2626
return 'vagrant';
2727
}
2828

29-
detectExistingInstall(cb = function(){}) {
29+
detectExistingInstall(done = function(){}) {
3030
let versionRegex = /Vagrant*\s(\d+\.\d+\.\d+)/;
3131
let command;
3232

@@ -57,14 +57,10 @@ class VagrantInstall extends InstallableItem {
5757
this.option['detected'].version = version;
5858
this.selectedOption = 'detected';
5959
this.validateVersion();
60-
cb();
60+
done();
6161
}).catch((error) => {
62-
if(Platform.OS === 'win32') {
63-
this.addOption('install',this.version,path.join(this.installerDataSvc.installRoot,'vagrant'),true);
64-
} else {
65-
this.selectedOption = 'detected';
66-
}
67-
cb(error);
62+
this.addOption('install',this.version,path.join(this.installerDataSvc.installRoot,'vagrant'),true);
63+
done(error);
6864
});
6965
}
7066

@@ -85,26 +81,15 @@ class VagrantInstall extends InstallableItem {
8581
}
8682
}
8783
}
84+
}
85+
86+
class VagrantInstallWindows extends VagrantInstall {
8887

8988
validateSelectedFolder(selection) {
9089
// should be called after path to vagrant changed
9190
}
9291

93-
install(progress, success, failure) {
94-
if( !this.getInstallAfter() || this.getInstallAfter().isInstalled() ) {
95-
this.postCygwinInstall(progress, success, failure);
96-
} else {
97-
let name = this.getInstallAfter().productName;
98-
progress.setStatus(`Waiting for ${name} to finish installation`);
99-
this.ipcRenderer.on('installComplete', (event, arg) => {
100-
if (!this.isInstalled() && arg === this.getInstallAfter().keyName) {
101-
this.postCygwinInstall(progress, success, failure);
102-
}
103-
});
104-
}
105-
}
106-
107-
postCygwinInstall(progress, success, failure) {
92+
installAfterRequirements(progress, success, failure) {
10893
progress.setStatus('Installing');
10994
if(this.selectedOption === 'install') {
11095
let installer = new Installer(VagrantInstall.KEY, progress, success, failure);
@@ -147,13 +132,48 @@ class VagrantInstall extends InstallableItem {
147132
installer.writeFile(this.vagrantPathScript, data)
148133
.then((result) => {
149134
return installer.execFile('powershell', args, result);
150-
}).then((result) => {
135+
}).then(() => {
151136
return installer.succeed(true);
152137
}).catch((result) => {
153138
return installer.fail(result);
154139
});
155140
}
141+
}
142+
143+
class VagrantInstallDarwin extends VagrantInstall {
144+
145+
installAfterRequirements(progress, success, failure) {
146+
progress.setStatus('Installing');
147+
if(this.selectedOption === 'install') {
148+
let dmgFile = this.downloadedFile;
149+
let timestamp = new Date().toJSON().replace(/:/g,'')
150+
let volumeName = `vagrant-1.8.1`;
151+
let shellScript = [
152+
`hdiutil attach -mountpoint /Volumes/${volumeName} ${dmgFile}`,
153+
`installer -pkg /Volumes/${volumeName}/Vagrant.pkg -target /`
154+
].join(';');
155+
let osaScript = [
156+
'osascript',
157+
'-e',
158+
`"do shell script \\\"${shellScript}\\\" with administrator privileges"`
159+
].join(' ');
160+
161+
let installer = new Installer(VagrantInstall.KEY, progress, success, failure);
162+
installer.exec(osaScript).then((result) => {
163+
return installer.succeed(result);
164+
}).catch((error) => {
165+
return installer.fail(error);
166+
});
167+
} else {
168+
success();
169+
}
170+
}
156171

157172
}
158173

159-
export default VagrantInstall;
174+
export default Platform.identify({
175+
darwin: ()=>VagrantInstallDarwin,
176+
default: ()=>VagrantInstallWindows
177+
});
178+
179+
export { VagrantInstall, VagrantInstallWindows, VagrantInstallDarwin };

browser/model/virtualbox.js

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -120,28 +120,14 @@ class VirtualBoxInstallWindows extends VirtualBoxInstall {
120120
this.selectedOption = 'detected';
121121
this.validateVersion();
122122
cb();
123-
}).catch((error) => {
123+
}).catch(() => {
124124
this.addOption('install',this.version,path.join(this.installerDataSvc.installRoot,'virtualbox'),true);
125125
this.addOption('different','','',false);
126126
cb();
127127
});
128128
}
129129

130-
install(progress, success, failure) {
131-
if( !this.getInstallAfter() || this.getInstallAfter().isInstalled() ) {
132-
this.postOpenJdk(progress, success, failure);
133-
} else {
134-
let name = this.getInstallAfter().productName;
135-
progress.setStatus(`Waiting for ${name} to finish installation`);
136-
this.ipcRenderer.on('installComplete', (event, arg) => {
137-
if (!this.isInstalled() && arg === this.getInstallAfter().keyName) {
138-
this.postOpenJdk(progress, success, failure);
139-
}
140-
});
141-
}
142-
}
143-
144-
postOpenJdk(progress, success, failure) {
130+
installAfterRequirements(progress, success, failure) {
145131
let installer = new Installer(VirtualBoxInstall.KEY, progress, success, failure);
146132
if(this.selectedOption === 'install') {
147133
installer.execFile(this.downloadedFile,
@@ -211,6 +197,7 @@ class VirtualBoxInstallWindows extends VirtualBoxInstall {
211197
}
212198

213199
class VirtualBoxInstallDarwin extends VirtualBoxInstall {
200+
214201
detectExistingInstall(done = function(){}) {
215202
let tempDetectedLocation = '';
216203

@@ -236,15 +223,43 @@ class VirtualBoxInstallDarwin extends VirtualBoxInstall {
236223
this.validateVersion();
237224
done();
238225
}).catch(() => {
239-
this.selectedOption = 'detected';
226+
this.addOption('install',this.version,path.join(this.installerDataSvc.installRoot,'virtualbox'),true);
240227
done();
241228
});
242229
}
230+
231+
installAfterRequirements(progress, success, failure) {
232+
progress.setStatus('Installing');
233+
if(this.selectedOption === 'install') {
234+
let dmgFile = this.downloadedFile;
235+
let timestamp = new Date().toJSON().replace(/:/g,'')
236+
let volumeName = `virtualbox-5.0.26`;
237+
let shellScript = [
238+
`hdiutil attach -mountpoint /Volumes/${volumeName} ${dmgFile}`,
239+
`installer -pkg /Volumes/${volumeName}/VirtualBox.pkg -target /`
240+
].join(';');
241+
let osaScript = [
242+
'osascript',
243+
'-e',
244+
`"do shell script \\\"${shellScript}\\\" with administrator privileges"`
245+
].join(' ');
246+
247+
let installer = new Installer(VirtualBoxInstall.KEY, progress, success, failure);
248+
installer.exec(osaScript).then((result) => {
249+
return installer.succeed(result);
250+
}).catch((error) => {
251+
return installer.fail(error);
252+
});
253+
} else {
254+
success();
255+
}
256+
}
257+
243258
}
244259

245260
export default Platform.identify({
246261
darwin: ()=>VirtualBoxInstallDarwin,
247262
default: ()=>VirtualBoxInstallWindows
248263
});
249264

250-
export { VirtualBoxInstall, VirtualBoxInstallDarwin };
265+
export { VirtualBoxInstall, VirtualBoxInstallWindows, VirtualBoxInstallDarwin };

browser/pages/confirm/confirm.html

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
<form name="confirmForm" id="confirmForm" class="form-horizontal" ng-submit="confCtrl.install()" ng-class="{'is-disabled':confCtrl.isDisabled}">
1818

1919
<!-- VirtualBox -->
20-
<div id="virtualbox-panel" class="panel panel-default panel2pxborder" ng-class="{'zero-border':checkboxModel.virtualbox.hasOption('detected') || platform === 'darwin'}">
20+
<div id="virtualbox-panel" class="panel panel-default panel2pxborder" ng-class="{'zero-border':checkboxModel.virtualbox.hasOption('detected')}">
2121
<div class="panel-heading panel-normal"
22-
ng-class="{'dotted-panel':checkboxModel.virtualbox.hasOption('detected') || platform === 'darwin'}">
22+
ng-class="{'dotted-panel':checkboxModel.virtualbox.hasOption('detected')}">
2323
<!--ng-click="checkboxModel.virtualbox.changeIsCollapsed()">-->
2424
<div class="checkbox-container verticalLine">
25-
<input type="checkbox" ng-disabled="checkboxModel.virtualbox.hasOption('detected') || checkboxModel.cdk.selectedOption=='install' || platform === 'darwin'" ng-model="checkboxModel.virtualbox.selectedOption" ng-true-value="'install'" ng-false-value="'detected'" aria-label="Toggle ngHide" class="vallign-middle" title="{{checkboxModel.virtualbox.hasOption('detected')?'Update is not supported yet':'Select to install';}}">
25+
<input type="checkbox" ng-disabled="checkboxModel.virtualbox.hasOption('detected') || checkboxModel.cdk.selectedOption=='install'" ng-model="checkboxModel.virtualbox.selectedOption" ng-true-value="'install'" ng-false-value="'detected'" aria-label="Toggle ngHide" class="vallign-middle" title="{{checkboxModel.virtualbox.hasOption('detected')?'Update is not supported yet':'Select to install';}}">
2626
</div>
2727
<div class="checkbox-container" ng-show="false">
2828
<div id="arrow-virtualbox" class="arrow" ng-class="{'arrow-down':!checkboxModel.virtualbox.isCollapsed}" aria-label="Toggle ngHide"></div>
@@ -118,20 +118,10 @@
118118
</div>
119119
</div>
120120

121-
<div class="message-container error-message" ng-show="!checkboxModel.virtualbox.isConfigured() && checkboxModel.cdk.selectedOption == 'install' && platform == 'win32'">
121+
<div class="message-container error-message" ng-show="!checkboxModel.virtualbox.isConfigured() && checkboxModel.cdk.selectedOption == 'install'">
122122
<span class="pficon pficon-error-circle-o"></span>
123123
<span>Red Hat Container Development Kit requires Oracle VirtualBox {{checkboxModel.virtualbox.minimumVersion}} or newer 5.0.x release. Please uninstall detected Oracle VirtualBox and restart Installer to continue.</span>
124124
</div>
125-
<div class="message-container error-message" ng-show="!confCtrl.isDisabled && checkboxModel.virtualbox.isInvalidVersionDetected() && checkboxModel.cdk.selectedOption == 'install' && platform == 'darwin'">
126-
<span class="pficon pficon-error-circle-o"></span>
127-
<span>Red Hat Container Development Kit requires Oracle VirtualBox {{checkboxModel.virtualbox.minimumVersion}} or newer 5.0.x release.
128-
Please uninstall detected Oracle VirtualBox and install version {{checkboxModel.virtualbox.minimumVersion}} downloaded from <a type="button" class="pointer" ng-click="confCtrl.download(checkboxModel.virtualbox.downloadUrl)">this location</a> and retart Installer to continue.</span>
129-
</div>
130-
<div class="message-container error-message" ng-show="!confCtrl.isDisabled && checkboxModel.virtualbox.isNotDetected() && checkboxModel.cdk.selectedOption == 'install' && platform == 'darwin'">
131-
<span class="pficon pficon-error-circle-o"></span>
132-
<span>Red Hat Container Development Kit requires Oracle VirtualBox {{checkboxModel.virtualbox.minimumVersion}} or newer 5.0.x release.
133-
Please install Oracle VirtualBox {{checkboxModel.virtualbox.minimumVersion}} downloaded from <a type="button" class="pointer" ng-click="confCtrl.download(checkboxModel.virtualbox.downloadUrl)">this location</a> and retart Installer to continue.</span>
134-
</div>
135125

136126
<!-- Cygwin -->
137127
<div id="cygwin-panel" class="panel panel-default panel2pxborder" ng-show="platform==='win32'" ng-class="{'zero-border': checkboxModel.cygwin.hasOption('detected') && checkboxModel.cygwin.selectedOption === 'detected'}">
@@ -203,12 +193,12 @@
203193
</div>
204194

205195
<!-- Vagrant-->
206-
<div id="vagrant-panel" class="panel panel-default panel2pxborder" ng-class="{'zero-border':checkboxModel.vagrant.hasOption('detected') || platform === 'darwin'}">
196+
<div id="vagrant-panel" class="panel panel-default panel2pxborder" ng-class="{'zero-border':checkboxModel.vagrant.hasOption('detected')}">
207197
<div class="panel-heading panel-normal"
208-
ng-class="{'dotted-panel':checkboxModel.vagrant.hasOption('detected') || platform === 'darwin'}">
198+
ng-class="{'dotted-panel':checkboxModel.vagrant.hasOption('detected')}">
209199
<!--ng-click="checkboxModel.vagrant.changeIsCollapsed()">-->
210200
<div class="checkbox-container verticalLine">
211-
<input type="checkbox" ng-disabled="checkboxModel.vagrant.hasOption('detected') || checkboxModel.cdk.selectedOption == 'install' || platform === 'darwin'" ng-model="checkboxModel.vagrant.selectedOption" aria-label="Toggle ngHide" class="vallign-middle" ng-true-value="'install'" ng-false-value="'detected'" class="vallign-middle" title="{{checkboxModel.vagrant.hasOption('detected')?'Update is not supported yet':'Select to install';}}">
201+
<input type="checkbox" ng-disabled="checkboxModel.vagrant.hasOption('detected') || checkboxModel.cdk.selectedOption == 'install'" ng-model="checkboxModel.vagrant.selectedOption" aria-label="Toggle ngHide" class="vallign-middle" ng-true-value="'install'" ng-false-value="'detected'" class="vallign-middle" title="{{checkboxModel.vagrant.hasOption('detected')?'Update is not supported yet':'Select to install';}}">
212202
</div>
213203
<div class="product-container">
214204
<div class="warnings-in-panel">
@@ -296,20 +286,10 @@
296286
</div>
297287
</div>
298288

299-
<div class="message-container error-message" ng-show="!checkboxModel.vagrant.isConfigured() && checkboxModel.cdk.selectedOption == 'install' && platform == 'win32'">
289+
<div class="message-container error-message" ng-show="!checkboxModel.vagrant.isConfigured() && checkboxModel.cdk.selectedOption == 'install'">
300290
<span class="pficon pficon-error-circle-o"></span>
301291
<span>Red Hat Container Development Kit requires Vagrant {{checkboxModel.vagrant.minimumVersion}} or newer. Please uninstall detected Vagrant and restart Installer to continue.</span>
302292
</div>
303-
<div class="message-container error-message" ng-show="!confCtrl.isDisabled && checkboxModel.vagrant.isInvalidVersionDetected() && checkboxModel.cdk.selectedOption == 'install' && platform == 'darwin'">
304-
<span class="pficon pficon-error-circle-o"></span>
305-
<span>Red Hat Container Development Kit requires Vagrant {{checkboxModel.vagrant.minimumVersion}} or newer.
306-
Please uninstall detected Vagrant and install version {{checkboxModel.vagrant.minimumVersion}} downloaded from <a type="button" class="pointer" ßng-click="confCtrl.download(checkboxModel.vagrand.downloadUrl)">this location</a> and retart Installer to continue.</span>
307-
</div>
308-
<div class="message-container error-message" ng-show="!confCtrl.isDisabled && checkboxModel.vagrant.isNotDetected() && checkboxModel.cdk.selectedOption == 'install' && platform == 'darwin'">
309-
<span class="pficon pficon-error-circle-o"></span>
310-
<span>Red Hat Container Development Kit requires Vagrant {{checkboxModel.vagrant.minimumVersion}} or newer.
311-
Please install Vagrant {{checkboxModel.vagrant.minimumVersion}} downloaded from <a type="button" class="pointer" ng-click="confCtrl.download(checkboxModel.vagrant.downloadUrl)">this location</a> and retart Installer to continue.</span>
312-
</div>
313293

314294
<!-- CDK -->
315295
<div id="cdk-panel" class="panel panel-default panel2pxborder" ng-class="{'zero-border':checkboxModel.cdk.hasOption('detected')}">

0 commit comments

Comments
 (0)