foreman_pipeline 0.0.8 → 0.0.10
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.
- checksums.yaml +5 -13
- data/app/assets/javascripts/foreman_pipeline/jenkins-instances/jenkins-instances.module.js +11 -14
- data/app/assets/javascripts/foreman_pipeline/jenkins-instances/views/jenkins-instances-table-collapsed.html +3 -4
- data/app/assets/javascripts/foreman_pipeline/jenkins-instances/views/jenkins-instances-table-full.html +5 -7
- data/app/assets/javascripts/foreman_pipeline/jenkins-users/details/views/jenkins-user-info.html +3 -3
- data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-hostgroups.html +10 -10
- data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-jenkins-projects.html +53 -61
- data/app/assets/javascripts/foreman_pipeline/jobs/jobs.module.js +27 -27
- data/app/assets/javascripts/foreman_pipeline/jobs/views/jobs-table-collapsed.html +3 -4
- data/app/assets/javascripts/foreman_pipeline/jobs/views/jobs-table-full.html +13 -15
- data/app/lib/actions/foreman_pipeline/jenkins_instance/abstract_jenkins_instance_action.rb +1 -2
- data/app/lib/actions/foreman_pipeline/job/create_activation_key.rb +6 -7
- data/app/lib/actions/foreman_pipeline/job/create_host.rb +1 -2
- data/app/lib/actions/foreman_pipeline/job/redeploy.rb +2 -2
- data/app/lib/actions/foreman_pipeline/job/wait_until_provisioned.rb +43 -0
- data/app/models/foreman_pipeline/authorization/base_model.rb +0 -1
- data/app/models/foreman_pipeline/jenkins_instance.rb +2 -2
- data/app/models/foreman_pipeline/job.rb +1 -2
- data/app/models/foreman_pipeline/job_jenkins_project.rb +1 -1
- data/lib/foreman_pipeline/engine.rb +21 -8
- data/lib/foreman_pipeline/monkeys.rb +8 -0
- data/lib/foreman_pipeline/plugin.rb +5 -3
- data/lib/foreman_pipeline/skip_tests.rb +79 -0
- data/lib/foreman_pipeline/version.rb +1 -1
- metadata +18 -72
- data/app/lib/actions/foreman_pipeline/jenkins/wait_host_ready.rb +0 -36
- data/app/lib/actions/foreman_pipeline/job/suspend_until_provisioned.rb +0 -13
checksums.yaml
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
|
|
5
|
-
data.tar.gz: !binary |-
|
|
6
|
-
ZTE5YjkzZGRhYmY1YjRmNGZiYTAyZTBhYTZmNmI1YWQxODY1ZjIyNw==
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: a501654448d142e85190824d0cf06d6eaeeba27e
|
|
4
|
+
data.tar.gz: 845841c7a98e4eb04a0567da42eb05202685cc74
|
|
7
5
|
SHA512:
|
|
8
|
-
metadata.gz:
|
|
9
|
-
|
|
10
|
-
YzhkNTQ2MmIzZTQxYjMzOThiOGFjNzNlMTgwNTQ5NDliNWU3YzQyMDRkN2Jl
|
|
11
|
-
Zjg0YjY2ZjllOWMxN2ZiMzQyZjVhMTRmNzdkZDUxYmQyZDE5NGM=
|
|
12
|
-
data.tar.gz: !binary |-
|
|
13
|
-
MjE0Y2JhYjVhYzdlMTg4NjZhOWIxZTJiNzI4YWQ3MTllNzkyODM3Yzc4OTk4
|
|
14
|
-
OGExNGNmMWQ2NzU2ODc2NTQ0OWU2NTZkMzkyZGU2ZGY4M2UwZGEyMDkxZTdj
|
|
15
|
-
YmUwODQ5NDgyNzk2MGFmMmU0NTYwMzI3ZjI0NjZjYzE0NDNkZDA=
|
|
6
|
+
metadata.gz: 79621a0bd84aa2a81bb5cf3245bf700d470a6d8d7506be2b54e0bb187fbdc7ecf1f7a726751ee45a125ee53048b8d9df722d2db5b8996d8892aea080f460952f
|
|
7
|
+
data.tar.gz: ede06ced9a323bc299e83956c4c35c0d8e03fde98e4a92f5f2db90fa6b7efff1188184a8150befa808c69ec5f7ab4e510ef9d344389b71c6af4dad2f4190c254
|
|
@@ -9,14 +9,14 @@ angular.module('ForemanPipeline.jenkins-instances').config(['$stateProvider', fu
|
|
|
9
9
|
$stateProvider.state('jenkins-instances', {
|
|
10
10
|
abstract: true,
|
|
11
11
|
controller: 'JenkinsInstancesController',
|
|
12
|
-
templateUrl: '
|
|
12
|
+
templateUrl: 'jenkins-instances/views/jenkins-instances.html'
|
|
13
13
|
})
|
|
14
14
|
.state('jenkins-instances.index', {
|
|
15
15
|
url: '/jenkins_instances',
|
|
16
16
|
permission: 'view_jenkins_instances',
|
|
17
17
|
views: {
|
|
18
18
|
'table': {
|
|
19
|
-
templateUrl: '
|
|
19
|
+
templateUrl: 'jenkins-instances/views/jenkins-instances-table-full.html'
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
})
|
|
@@ -26,18 +26,17 @@ angular.module('ForemanPipeline.jenkins-instances').config(['$stateProvider', fu
|
|
|
26
26
|
collapsed: true,
|
|
27
27
|
views: {
|
|
28
28
|
'table': {
|
|
29
|
-
templateUrl: '
|
|
29
|
+
templateUrl: 'jenkins-instances/views/jenkins-instances-table-collapsed.html'
|
|
30
30
|
},
|
|
31
31
|
'action-panel': {
|
|
32
32
|
controller: 'NewJenkinsInstanceController',
|
|
33
|
-
templateUrl: '
|
|
33
|
+
templateUrl: 'jenkins-instances/new/views/new-jenkins-instance.html'
|
|
34
34
|
},
|
|
35
35
|
'jenkins-instance-form@jenkins-instances.new': {
|
|
36
36
|
controller: 'NewJenkinsInstanceController',
|
|
37
|
-
templateUrl: '
|
|
37
|
+
templateUrl: 'jenkins-instances/new/views/new-jenkins-instance-form.html'
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
|
|
41
40
|
})
|
|
42
41
|
.state('jenkins-instances.details', {
|
|
43
42
|
abstract: true,
|
|
@@ -46,11 +45,11 @@ angular.module('ForemanPipeline.jenkins-instances').config(['$stateProvider', fu
|
|
|
46
45
|
collapsed: true,
|
|
47
46
|
views: {
|
|
48
47
|
'table': {
|
|
49
|
-
templateUrl: '
|
|
48
|
+
templateUrl: 'jenkins-instances/views/jenkins-instances-table-collapsed.html'
|
|
50
49
|
},
|
|
51
50
|
'action-panel': {
|
|
52
51
|
controller: 'JenkinsInstanceDetailsController',
|
|
53
|
-
templateUrl: '
|
|
52
|
+
templateUrl: 'jenkins-instances/details/views/jenkins-instance-details.html'
|
|
54
53
|
}
|
|
55
54
|
}
|
|
56
55
|
})
|
|
@@ -59,7 +58,7 @@ angular.module('ForemanPipeline.jenkins-instances').config(['$stateProvider', fu
|
|
|
59
58
|
permission: 'edit_jenkins_instances',
|
|
60
59
|
collapsed: true,
|
|
61
60
|
controller: 'JenkinsInstanceDetailsInfoController',
|
|
62
|
-
templateUrl: '
|
|
61
|
+
templateUrl: 'jenkins-instances/details/views/jenkins-instance-details-info.html'
|
|
63
62
|
})
|
|
64
63
|
|
|
65
64
|
.state('jenkins-instances.details.users', {
|
|
@@ -72,22 +71,20 @@ angular.module('ForemanPipeline.jenkins-instances').config(['$stateProvider', fu
|
|
|
72
71
|
permission: 'view_jenkins_users',
|
|
73
72
|
collapsed: true,
|
|
74
73
|
controller: 'JenkinsInstanceDetailsJenkinsUsersController',
|
|
75
|
-
templateUrl: '
|
|
74
|
+
templateUrl: 'jenkins-instances/details/views/jenkins-instance-details-users.html'
|
|
76
75
|
})
|
|
77
76
|
.state('jenkins-instances.details.users.new', {
|
|
78
77
|
url: '/jenkins_users/new',
|
|
79
78
|
permission: 'create_jenkins_users',
|
|
80
79
|
collapsed: true,
|
|
81
80
|
controller: 'NewJenkinsUserController',
|
|
82
|
-
templateUrl: '
|
|
81
|
+
templateUrl: 'jenkins-users/new/views/new-jenkins-user.html'
|
|
83
82
|
})
|
|
84
83
|
.state('jenkins-instances.details.users.info', {
|
|
85
84
|
url: '/jenkins_users/:jenkinsUserId',
|
|
86
85
|
permission: 'edit_jenkins_users',
|
|
87
86
|
collapsed: true,
|
|
88
87
|
controller: 'JenkinsUserInfoController',
|
|
89
|
-
templateUrl: '
|
|
88
|
+
templateUrl: 'jenkins-users/details/views/jenkins-user-info.html'
|
|
90
89
|
})
|
|
91
|
-
|
|
92
|
-
|
|
93
90
|
}]);
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
<table class="table table-striped" ng-class="{'table-mask': jenkinsTable.working}">
|
|
2
2
|
<thead>
|
|
3
|
-
<tr bst-table-head
|
|
4
|
-
<th bst-table-column sortable><span translate>Name</span></th>
|
|
3
|
+
<tr bst-table-head>
|
|
4
|
+
<th bst-table-column="name" sortable><span translate>Name</span></th>
|
|
5
5
|
</tr>
|
|
6
6
|
</thead>
|
|
7
7
|
|
|
8
8
|
<tbody>
|
|
9
9
|
<tr bst-table-row
|
|
10
10
|
ng-repeat="jenkins in jenkinsTable.rows"
|
|
11
|
-
row-select="jenkins"
|
|
12
11
|
active-row="stateIncludes('jenkins-instance.details', {jenkinsInstanceId: jenkins.id})">
|
|
13
12
|
<td bst-table-cell>
|
|
14
13
|
<a ui-sref="jenkins-instances.details.info({jenkinsInstanceId: jenkins.id})">
|
|
@@ -17,4 +16,4 @@
|
|
|
17
16
|
</td>
|
|
18
17
|
</tr>
|
|
19
18
|
</tbody>
|
|
20
|
-
</table>
|
|
19
|
+
</table>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
ng-class="{'table-mask' : jenkinsTable.working}"
|
|
3
3
|
ng-show="jenkinsTable.rows.length > 0">
|
|
4
4
|
<thead>
|
|
5
|
-
<tr bst-table-head
|
|
5
|
+
<tr bst-table-head>
|
|
6
6
|
<th bst-table-column="name" sortable><span translate>Name</span></th>
|
|
7
7
|
<th bst-table-column="url"><span translate>URL</span></th>
|
|
8
8
|
</tr>
|
|
@@ -12,19 +12,17 @@
|
|
|
12
12
|
<div data-extend-template="layouts/select-all-results.html"></div>
|
|
13
13
|
|
|
14
14
|
<tbody>
|
|
15
|
-
<tr bst-table-row ng-repeat="jenkins in jenkinsTable.rows"
|
|
16
|
-
|
|
15
|
+
<tr bst-table-row ng-repeat="jenkins in jenkinsTable.rows">
|
|
16
|
+
|
|
17
17
|
<td bst-table-cell>
|
|
18
18
|
<a ui-sref="jenkins-instances.details.info({jenkinsInstanceId: jenkins.id})">
|
|
19
|
-
<div>{{ jenkins.name }}</div>
|
|
19
|
+
<div>{{ jenkins.name }}</div>
|
|
20
20
|
</a>
|
|
21
21
|
</td>
|
|
22
22
|
|
|
23
23
|
<td bst-table-cell>
|
|
24
|
-
<div>{{ jenkins.url }}</div>
|
|
24
|
+
<div>{{ jenkins.url }}</div>
|
|
25
25
|
</td>
|
|
26
|
-
|
|
27
26
|
</tr>
|
|
28
27
|
</tbody>
|
|
29
|
-
|
|
30
28
|
</table>
|
data/app/assets/javascripts/foreman_pipeline/jenkins-users/details/views/jenkins-user-info.html
CHANGED
|
@@ -28,10 +28,10 @@
|
|
|
28
28
|
on-save="save(jenkinsUser)">
|
|
29
29
|
</span>
|
|
30
30
|
</div>
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
<p class="alert alert-info" translate>
|
|
33
33
|
The token is not displayed for security reasons. Type in the new one or leave blank to keep the current token.
|
|
34
|
-
</p>
|
|
34
|
+
</p>
|
|
35
35
|
|
|
36
36
|
</section>
|
|
37
|
-
</div>
|
|
37
|
+
</div>
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
<span page-title ng-model="job">{{ 'Job: ' | translate }} {{ job.name }}</span>
|
|
2
2
|
|
|
3
|
-
<
|
|
3
|
+
<section class="details details-full">
|
|
4
4
|
<div bst-alerts success-messages="successMessages" error-messages="errorMessages"></div>
|
|
5
5
|
|
|
6
6
|
<h4>
|
|
7
7
|
<span translate>Current Hostgroup: </span>
|
|
8
8
|
<a ng-click="transitionToHostgroup(job.hostgroup)" ng-show="job.hostgroup.name">
|
|
9
9
|
<span class="no-capitalize" ng-bind="job.hostgroup.name"></span>
|
|
10
|
-
</a>
|
|
10
|
+
</a>
|
|
11
11
|
<span class="no-capitalize" ng-show="!job.hostgroup.name" translate>none</span>
|
|
12
12
|
</h4>
|
|
13
13
|
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
|
|
22
22
|
<p class="alert alert-info"
|
|
23
23
|
ng-hide="hostgroupsTable.working"
|
|
24
|
-
translate> No Hostgroups to show.
|
|
25
|
-
</p>
|
|
24
|
+
translate> No Hostgroups to show.
|
|
25
|
+
</p>
|
|
26
26
|
</div>
|
|
27
27
|
|
|
28
28
|
<section ng-show="hostgroupsTable.rows.length > 0">
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
ng-hide="edit_jobs"
|
|
41
41
|
ng-disabled="!hostgroupsTable.chosenRow || hostgroupsTable.working"
|
|
42
42
|
ng-click="setHostgroup()">
|
|
43
|
-
<i class="fa fa-pencil" ng-hide="hostgroupsTable.working"></i>
|
|
44
|
-
<i class="fa fa-spinner fa-spin" ng-show="hostgroupsTable.working"></i>
|
|
43
|
+
<i class="fa fa-pencil" ng-hide="hostgroupsTable.working"></i>
|
|
44
|
+
<i class="fa fa-spinner fa-spin" ng-show="hostgroupsTable.working"></i>
|
|
45
45
|
{{ 'Set Hostgroup' | translate }}
|
|
46
46
|
</button>
|
|
47
47
|
</div>
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
<div bst-table="hostgroupsTable" class="nutupane">
|
|
51
51
|
<div bst-container-scroll bst-infinite-scroll="hostgroupsTable.nextPage()">
|
|
52
52
|
|
|
53
|
-
<table
|
|
53
|
+
<table
|
|
54
54
|
ng-class="{'table-mask': hostgroupsTable.working}"
|
|
55
55
|
class="table table-striped table-full">
|
|
56
56
|
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
|
|
64
64
|
<tbody>
|
|
65
65
|
<tr bst-table-row ng-repeat="hostgroup in hostgroupsTable.rows | filter:hostgroupFilter" row-choice="hostgroup">
|
|
66
|
-
|
|
66
|
+
|
|
67
67
|
<td bst-table-cell>
|
|
68
68
|
<a ng-click="transitionToHostgroup(hostgroup)">
|
|
69
69
|
{{ hostgroup.name }}
|
|
@@ -73,9 +73,9 @@
|
|
|
73
73
|
|
|
74
74
|
</tr>
|
|
75
75
|
</tbody>
|
|
76
|
-
|
|
76
|
+
|
|
77
77
|
</table>
|
|
78
78
|
</div>
|
|
79
79
|
</div>
|
|
80
80
|
</section>
|
|
81
|
-
</
|
|
81
|
+
</section>
|
data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-jenkins-projects.html
CHANGED
|
@@ -6,70 +6,62 @@
|
|
|
6
6
|
<h4>
|
|
7
7
|
<span translate>Current Jenkins Projects: </span>
|
|
8
8
|
</h4>
|
|
9
|
-
|
|
10
|
-
<input type="text"
|
|
11
|
-
class="form-control filter-input"
|
|
12
|
-
placeholder="{{ 'Filter' | translate }}"
|
|
13
|
-
ng-model="jenkinsFilter"/>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
<span class="pull-right">
|
|
17
|
-
<button class="btn btn-default"
|
|
18
|
-
ng-disabled="projectsTable.numSelected === 0 || projectsTable.working"
|
|
19
|
-
ng-show="isState('jobs.details.jenkins-projects.list') && permitted('edit_jobs', job) && projectsTable.rows.length > 0"
|
|
20
|
-
ng-click="removeProjects()">
|
|
21
|
-
<i class="fa fa-minus" ng-hide="projectsTable.working"></i>
|
|
22
|
-
<i class="fa fa-spinner fa-spin" ng-show="projectsTable.working"></i>
|
|
23
|
-
<span translate>Remove Projects</span>
|
|
24
|
-
</button>
|
|
25
|
-
|
|
26
|
-
<button class="btn btn-default"
|
|
27
|
-
ng-show="isState('jobs.details.jenkins-projects.list')
|
|
28
|
-
&& permitted('edit_jobs', job)
|
|
29
|
-
&& job.jenkins_instance !== null
|
|
30
|
-
&& job.jenkins_user !== null"
|
|
31
|
-
ui-sref="jobs.details.jenkins-projects.discovery({jobId: job.id})"
|
|
32
|
-
translate>
|
|
33
|
-
<i class="fa fa-eye"></i>
|
|
34
|
-
Find more...
|
|
35
|
-
</button>
|
|
36
|
-
</span>
|
|
37
9
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
<table bst-table="projectsTable"
|
|
42
|
-
class="table table-striped"
|
|
43
|
-
ng-show="projectsTable.rows.length > 0 && !projectsTable.working"
|
|
44
|
-
ng-class="{'table-mask': projectsTable.working}">
|
|
45
|
-
<thead>
|
|
46
|
-
<tr bst-table-head row-select="jenkinsProject">
|
|
47
|
-
<th bst-table-column="name" translate>Name</th>
|
|
48
|
-
</tr>
|
|
49
|
-
</thead>
|
|
10
|
+
</br>
|
|
50
11
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
</tr>
|
|
59
|
-
</tbody>
|
|
12
|
+
<div class="details-header row">
|
|
13
|
+
<div class="col-sm-3">
|
|
14
|
+
<input type="text"
|
|
15
|
+
class="form-control filter-input"
|
|
16
|
+
placeholder="{{ 'Filter' | translate }}"
|
|
17
|
+
ng-model="jenkinsFilter"/>
|
|
18
|
+
</div>
|
|
60
19
|
|
|
61
|
-
</table>
|
|
62
20
|
|
|
63
|
-
|
|
21
|
+
<div class="fr select-action">
|
|
22
|
+
<button class="btn btn-default"
|
|
23
|
+
ng-disabled="projectsTable.numSelected === 0 || projectsTable.working"
|
|
24
|
+
ng-show="isState('jobs.details.jenkins-projects.list') && permitted('edit_jobs', job) && projectsTable.rows.length > 0"
|
|
25
|
+
ng-click="removeProjects()">
|
|
26
|
+
<i class="fa fa-minus" ng-hide="projectsTable.working"></i>
|
|
27
|
+
<i class="fa fa-spinner fa-spin" ng-show="projectsTable.working"></i>
|
|
28
|
+
<span translate>Remove Projects</span>
|
|
29
|
+
</button>
|
|
30
|
+
|
|
31
|
+
<button class="btn btn-default"
|
|
32
|
+
ng-show="isState('jobs.details.jenkins-projects.list')
|
|
33
|
+
&& permitted('edit_jobs', job)
|
|
34
|
+
&& job.jenkins_instance !== null
|
|
35
|
+
&& job.jenkins_user !== null"
|
|
36
|
+
ui-sref="jobs.details.jenkins-projects.discovery({jobId: job.id})"
|
|
37
|
+
translate>
|
|
38
|
+
<i class="fa fa-eye"></i>
|
|
39
|
+
Find more...
|
|
40
|
+
</button>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<table bst-table="projectsTable"
|
|
45
|
+
class="table table-striped"
|
|
46
|
+
ng-show="projectsTable.rows.length > 0 && !projectsTable.working"
|
|
47
|
+
ng-class="{'table-mask': projectsTable.working}">
|
|
48
|
+
<thead>
|
|
49
|
+
<tr bst-table-head row-select="jenkinsProject">
|
|
50
|
+
<th bst-table-column="name" translate>Name</th>
|
|
51
|
+
</tr>
|
|
52
|
+
</thead>
|
|
64
53
|
|
|
65
|
-
<
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
54
|
+
<tbody>
|
|
55
|
+
<tr bst-table-row ng-repeat="jenkinsProject in projectsTable.rows | filter:jenkinsFilter" row-select="jenkinsProject">
|
|
56
|
+
<td bst-table-cell>
|
|
57
|
+
<a href="" ui-sref="jobs.details.jenkins-projects.parameters({ projectId: jenkinsProject.id })">
|
|
58
|
+
{{ jenkinsProject.name }}
|
|
59
|
+
</a>
|
|
60
|
+
</td>
|
|
61
|
+
</tr>
|
|
62
|
+
</tbody>
|
|
63
|
+
|
|
64
|
+
</table>
|
|
65
|
+
|
|
66
|
+
</section>
|
|
70
67
|
|
|
71
|
-
<p class="alert alert-info"
|
|
72
|
-
ng-hide="projectsTable.working"
|
|
73
|
-
translate> No Jenkins Projects to show.
|
|
74
|
-
</p>
|
|
75
|
-
</div>
|
|
@@ -9,16 +9,16 @@ angular.module('ForemanPipeline.jobs').config(['$stateProvider', function ($stat
|
|
|
9
9
|
$stateProvider.state('jobs', {
|
|
10
10
|
abstract: true,
|
|
11
11
|
controller: 'JobsController',
|
|
12
|
-
templateUrl: '
|
|
12
|
+
templateUrl: 'jobs/views/jobs.html'
|
|
13
13
|
})
|
|
14
14
|
.state('jobs.index', {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
url: '/jobs',
|
|
16
|
+
permission: 'view_jobs',
|
|
17
|
+
views: {
|
|
18
|
+
'table': {
|
|
19
|
+
templateUrl: 'jobs/views/jobs-table-full.html'
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
22
|
})
|
|
23
23
|
.state('jobs.new', {
|
|
24
24
|
url: '/jobs/new',
|
|
@@ -26,15 +26,15 @@ angular.module('ForemanPipeline.jobs').config(['$stateProvider', function ($stat
|
|
|
26
26
|
collapsed: true,
|
|
27
27
|
views: {
|
|
28
28
|
'table': {
|
|
29
|
-
templateUrl: '
|
|
29
|
+
templateUrl: 'jobs/views/jobs-table-collapsed.html'
|
|
30
30
|
},
|
|
31
31
|
'action-panel': {
|
|
32
32
|
controller: 'NewJobController',
|
|
33
|
-
templateUrl: '
|
|
33
|
+
templateUrl: 'jobs/new/views/new-job.html'
|
|
34
34
|
},
|
|
35
35
|
'job-form@jobs.new': {
|
|
36
36
|
controller: 'NewJobController',
|
|
37
|
-
templateUrl: '
|
|
37
|
+
templateUrl: 'jobs/new/views/new-job-form.html'
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
})
|
|
@@ -45,11 +45,11 @@ angular.module('ForemanPipeline.jobs').config(['$stateProvider', function ($stat
|
|
|
45
45
|
collapsed: true,
|
|
46
46
|
views: {
|
|
47
47
|
'table': {
|
|
48
|
-
templateUrl: '
|
|
48
|
+
templateUrl: 'jobs/views/jobs-table-collapsed.html'
|
|
49
49
|
},
|
|
50
50
|
'action-panel': {
|
|
51
51
|
controller: 'JobDetailsController',
|
|
52
|
-
templateUrl: '
|
|
52
|
+
templateUrl: 'jobs/details/views/job-details.html'
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
})
|
|
@@ -58,22 +58,22 @@ angular.module('ForemanPipeline.jobs').config(['$stateProvider', function ($stat
|
|
|
58
58
|
permission: 'edit_jobs',
|
|
59
59
|
collapsed: true,
|
|
60
60
|
controller: 'JobDetailsInfoController',
|
|
61
|
-
templateUrl: '
|
|
61
|
+
templateUrl: 'jobs/details/views/job-details-info.html'
|
|
62
62
|
})
|
|
63
63
|
.state('jobs.details.content-views', {
|
|
64
64
|
url: '/content_views',
|
|
65
65
|
permission: 'edit_jobs',
|
|
66
66
|
collapsed: true,
|
|
67
67
|
controller: 'JobDetailsContentViewsController',
|
|
68
|
-
templateUrl: '
|
|
68
|
+
templateUrl: 'jobs/details/views/job-details-content-views.html'
|
|
69
69
|
})
|
|
70
|
-
|
|
70
|
+
|
|
71
71
|
.state('jobs.details.hostgroups', {
|
|
72
72
|
url: '/hostgroups',
|
|
73
73
|
permission: 'edit_jobs',
|
|
74
74
|
collapsed: true,
|
|
75
75
|
controller: 'JobDetailsHostgroupsController',
|
|
76
|
-
templateUrl: '
|
|
76
|
+
templateUrl: 'jobs/details/views/job-details-hostgroups.html'
|
|
77
77
|
})
|
|
78
78
|
|
|
79
79
|
.state('jobs.details.resources', {
|
|
@@ -81,7 +81,7 @@ angular.module('ForemanPipeline.jobs').config(['$stateProvider', function ($stat
|
|
|
81
81
|
collapsed: true,
|
|
82
82
|
permission: 'edit_jobs',
|
|
83
83
|
controller: 'JobDetailsResourcesController',
|
|
84
|
-
templateUrl: '
|
|
84
|
+
templateUrl: 'jobs/details/views/job-details-resources.html'
|
|
85
85
|
})
|
|
86
86
|
|
|
87
87
|
.state('jobs.details.environments', {
|
|
@@ -94,7 +94,7 @@ angular.module('ForemanPipeline.jobs').config(['$stateProvider', function ($stat
|
|
|
94
94
|
collapsed: true,
|
|
95
95
|
permission: 'edit_jobs',
|
|
96
96
|
controller: 'JobDetailsEnvironmentsController',
|
|
97
|
-
templateUrl: '
|
|
97
|
+
templateUrl: 'jobs/details/views/job-details-environments.html'
|
|
98
98
|
})
|
|
99
99
|
|
|
100
100
|
.state('jobs.details.environments.to-environments', {
|
|
@@ -102,7 +102,7 @@ angular.module('ForemanPipeline.jobs').config(['$stateProvider', function ($stat
|
|
|
102
102
|
collapsed: true,
|
|
103
103
|
permission: 'edit_jobs',
|
|
104
104
|
controller: 'JobDetailsToEnvironmentsController',
|
|
105
|
-
templateUrl: '
|
|
105
|
+
templateUrl: 'jobs/details/views/job-details-to-environments.html'
|
|
106
106
|
})
|
|
107
107
|
|
|
108
108
|
.state('jobs.details.jenkins-instances', {
|
|
@@ -110,12 +110,12 @@ angular.module('ForemanPipeline.jobs').config(['$stateProvider', function ($stat
|
|
|
110
110
|
collapsed: true,
|
|
111
111
|
permission: 'edit_jobs',
|
|
112
112
|
controller: 'JobDetailsJenkinsController',
|
|
113
|
-
templateUrl: '
|
|
113
|
+
templateUrl: 'jobs/details/views/job-details-jenkins.html'
|
|
114
114
|
})
|
|
115
115
|
.state('jobs.details.jenkins-projects', {
|
|
116
116
|
abstract: true,
|
|
117
117
|
collapsed: true,
|
|
118
|
-
templateUrl: '
|
|
118
|
+
templateUrl: 'jobs/details/project-discovery/views/job-jenkins-projects.html'
|
|
119
119
|
})
|
|
120
120
|
|
|
121
121
|
.state('jobs.details.jenkins-projects.list', {
|
|
@@ -123,20 +123,20 @@ angular.module('ForemanPipeline.jobs').config(['$stateProvider', function ($stat
|
|
|
123
123
|
collapsed: true,
|
|
124
124
|
permission: 'edit_jobs',
|
|
125
125
|
controller: 'JobDetailsJenkinsProjectsController',
|
|
126
|
-
templateUrl: '
|
|
126
|
+
templateUrl: 'jobs/details/views/job-details-jenkins-projects.html'
|
|
127
127
|
})
|
|
128
128
|
.state('jobs.details.jenkins-projects.discovery', {
|
|
129
129
|
url: '/jenkins_projects/discovery',
|
|
130
130
|
collapsed: true,
|
|
131
131
|
permission: 'edit_jobs',
|
|
132
132
|
controller: 'JobProjectsDiscoveryController',
|
|
133
|
-
templateUrl: '
|
|
133
|
+
templateUrl: 'jobs/details/project-discovery/views/job-projects-discovery.html'
|
|
134
134
|
})
|
|
135
135
|
.state('jobs.details.jenkins-projects.parameters', {
|
|
136
136
|
url: '/jenkins_projects/:projectId',
|
|
137
137
|
collapsed: true,
|
|
138
138
|
permission: 'edit_jobs',
|
|
139
|
-
controller: 'JobProjectsParametersController',
|
|
140
|
-
templateUrl: '
|
|
139
|
+
controller: 'JobProjectsParametersController',
|
|
140
|
+
templateUrl: 'jobs/details/project-discovery/views/job-projects-parameters.html'
|
|
141
141
|
})
|
|
142
|
-
}]);
|
|
142
|
+
}]);
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
<table class="table table-striped" ng-class="{'table-mask': jobsTable.working}">
|
|
2
2
|
<thead>
|
|
3
|
-
<tr bst-table-head
|
|
4
|
-
<th bst-table-column sortable><span translate>Name</span></th>
|
|
3
|
+
<tr bst-table-head>
|
|
4
|
+
<th bst-table-column="name" sortable><span translate>Name</span></th>
|
|
5
5
|
</tr>
|
|
6
6
|
</thead>
|
|
7
7
|
|
|
8
8
|
<tbody>
|
|
9
9
|
<tr bst-table-row
|
|
10
10
|
ng-repeat="job in jobsTable.rows"
|
|
11
|
-
row-select="job"
|
|
12
11
|
active-row="stateIncludes('jobs.details', {jobId: job.id})">
|
|
13
12
|
<td bst-table-cell>
|
|
14
13
|
<a ui-sref="jobs.details.info({jobId: job.id})">
|
|
@@ -17,4 +16,4 @@
|
|
|
17
16
|
</td>
|
|
18
17
|
</tr>
|
|
19
18
|
</tbody>
|
|
20
|
-
</table>
|
|
19
|
+
</table>
|
|
@@ -3,25 +3,23 @@
|
|
|
3
3
|
You currently do not have any Jobs. You can add Jobs using the button on the right.
|
|
4
4
|
</span>
|
|
5
5
|
</p>
|
|
6
|
-
|
|
7
6
|
<table class="table table-striped"
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
ng-class="{'table-mask' : jobsTable.working}"
|
|
8
|
+
ng-show="jobsTable.rows.length > 0">
|
|
10
9
|
<thead>
|
|
11
|
-
<tr bst-table-head
|
|
10
|
+
<tr bst-table-head>
|
|
12
11
|
<th bst-table-column="name" sortable><span translate>Name</span></th>
|
|
13
12
|
<th bst-table-column="content_view"><span translate>Content View</span></th>
|
|
14
13
|
<th bst-table-column="hostgroup"><span translate>Hostgroup</span></th>
|
|
15
14
|
<th bst-table-column="environment"><span translate>Environment</span></th>
|
|
16
15
|
<th bst-table-column="jenkinsInstance"><span translate>Jenkins Instance</span></th>
|
|
17
|
-
|
|
18
16
|
</tr>
|
|
19
17
|
</thead>
|
|
20
18
|
|
|
21
19
|
<div data-extend-template="layouts/select-all-results.html"></div>
|
|
22
20
|
|
|
23
21
|
<tbody>
|
|
24
|
-
<tr bst-table-row ng-repeat="job in jobsTable.rows"
|
|
22
|
+
<tr bst-table-row ng-repeat="job in jobsTable.rows">
|
|
25
23
|
<td bst-table-cell>
|
|
26
24
|
<a ui-sref="jobs.details.info({jobId: job.id})">
|
|
27
25
|
<div>{{ job.name }}</div>
|
|
@@ -29,7 +27,7 @@
|
|
|
29
27
|
</td>
|
|
30
28
|
<td bst-table-cell>
|
|
31
29
|
<a ng-show="{{ job.content_view !== null }}"
|
|
32
|
-
ui-sref="content-views.details.info({ contentViewId: job.content_view.id })">
|
|
30
|
+
ui-sref="content-views.details.info({ contentViewId: job.content_view.id })">
|
|
33
31
|
<div>{{ job.content_view.name }}</div>
|
|
34
32
|
</a>
|
|
35
33
|
<div ng-show="{{ job.content_view === null }}" translate>none</div>
|
|
@@ -39,28 +37,28 @@
|
|
|
39
37
|
ng-click="transitionToHostgroup(job.hostgroup)">
|
|
40
38
|
<div>{{ job.hostgroup.name }}</div>
|
|
41
39
|
</a>
|
|
42
|
-
|
|
40
|
+
|
|
43
41
|
<div ng-show="{{ job.hostgroup === null }}" translate>none</div>
|
|
44
|
-
|
|
42
|
+
|
|
45
43
|
</td>
|
|
46
44
|
<td bst-table-cell>
|
|
47
45
|
<a ng-show="{{ job.environment !== null }}"
|
|
48
46
|
ui-sref="environments.environment.details({ environmentId: job.environment.id })">
|
|
49
47
|
<div>{{ job.environment.name }}</div>
|
|
50
48
|
</a>
|
|
51
|
-
|
|
49
|
+
|
|
52
50
|
<div ng-show="{{ job.environment === null }}" translate>none</div>
|
|
53
|
-
|
|
51
|
+
|
|
54
52
|
</td>
|
|
55
53
|
<td bst-table-cell>
|
|
56
54
|
<a ng-show="{{ job.jenkins_instance !== null }}"
|
|
57
55
|
ui-sref="jenkins-instances.details.info({ jenkinsInstanceId: job.jenkins_instance.id })">
|
|
58
56
|
<div>{{ job.jenkins_instance.name }}</div>
|
|
59
57
|
</a>
|
|
60
|
-
|
|
58
|
+
|
|
61
59
|
<div ng-show="{{ job.jenkins_instance === null }}" translate>none</div>
|
|
62
|
-
|
|
60
|
+
|
|
63
61
|
</td>
|
|
64
62
|
</tr>
|
|
65
|
-
</tbody>
|
|
66
|
-
</table>
|
|
63
|
+
</tbody>
|
|
64
|
+
</table>
|
|
@@ -6,13 +6,12 @@ module Actions
|
|
|
6
6
|
|
|
7
7
|
def run
|
|
8
8
|
output[:new_key] = ::Katello::ActivationKey.create(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
)
|
|
9
|
+
:name => "key-for-#{input[:name]}",
|
|
10
|
+
:organization_id => input[:organization_id],
|
|
11
|
+
:environment_id => input[:environment_id],
|
|
12
|
+
:content_view_id => input[:content_view_id],
|
|
13
|
+
:user_id => ::User.current.id,
|
|
14
|
+
:cp_id => input[:cp_id])
|
|
16
15
|
end
|
|
17
16
|
end
|
|
18
17
|
end
|
|
@@ -77,9 +77,8 @@ module Actions
|
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
def jenkins_pubkey_param_for(host)
|
|
80
|
-
::HostParameter.create(:name => 'foreman_pipeline_jenkins_pubkey', :value => jenkins_pubkey, :
|
|
80
|
+
::HostParameter.create(:name => 'foreman_pipeline_jenkins_pubkey', :value => jenkins_pubkey, :reference_id => host.id)
|
|
81
81
|
end
|
|
82
|
-
|
|
83
82
|
end
|
|
84
83
|
end
|
|
85
84
|
end
|
|
@@ -20,10 +20,10 @@ module Actions
|
|
|
20
20
|
:activation_key => create_key.output[:new_key],
|
|
21
21
|
:jenkins_instance_id => job.jenkins_instance_id})
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
wait_until = plan_action(WaitUntilProvisioned, :host_id => create_host.output[:host][:id])
|
|
24
24
|
|
|
25
25
|
plan_self(:create_host => create_host.output[:host],
|
|
26
|
-
:installed_at =>
|
|
26
|
+
:installed_at => wait_until.output[:host][:installed_at],
|
|
27
27
|
:new_key => create_key.output[:new_key])
|
|
28
28
|
|
|
29
29
|
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module Actions
|
|
2
|
+
module ForemanPipeline
|
|
3
|
+
module Job
|
|
4
|
+
class WaitUntilProvisioned < Actions::Base
|
|
5
|
+
include ::Dynflow::Action::Cancellable
|
|
6
|
+
include ::Dynflow::Action::Polling
|
|
7
|
+
|
|
8
|
+
def done?
|
|
9
|
+
external_task[:build]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def timeout
|
|
13
|
+
input[:timeout] || 2 * 60 * 60 # 2 hours default
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def invoke_external_task
|
|
17
|
+
schedule_timeout(timeout) unless timeout <= 0
|
|
18
|
+
build_status
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def poll_external_task
|
|
22
|
+
fail(_("'%s' is a required parameter") % 'host_id') unless input.key?(:host_id)
|
|
23
|
+
host = Host.find(input[:host_id])
|
|
24
|
+
create_output(host)
|
|
25
|
+
build_status(host)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def poll_interval
|
|
29
|
+
30
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def create_output(host)
|
|
33
|
+
output[:host] = host
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def build_status(host = nil)
|
|
37
|
+
status = (!host.nil? && (host.reports.count > 1) && !host.reports.last.error?)
|
|
38
|
+
{ :build => status }
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -14,11 +14,11 @@ module ForemanPipeline
|
|
|
14
14
|
has_many :jobs, :class_name => "ForemanPipeline::Job", :dependent => :nullify
|
|
15
15
|
belongs_to :jenkins_user, :class_name => "ForemanPipeline::JenkinsUser"
|
|
16
16
|
|
|
17
|
-
FILEPATH_REGEX =
|
|
17
|
+
FILEPATH_REGEX = /\A(\/|~)[a-z0-9\-_.\/]*[^\/]\z/i
|
|
18
18
|
|
|
19
19
|
validates :name, :presence => true
|
|
20
20
|
validates :cert_path, :format => {:with => FILEPATH_REGEX }
|
|
21
|
-
validates :url, :uniqueness => true, :format => { :with =>
|
|
21
|
+
validates :url, :uniqueness => true, :format => { :with => /\A(http|https):\/\/\S+:\d{1,4}\z/}
|
|
22
22
|
validates :organization, :presence => true
|
|
23
23
|
validates :jenkins_home, :format => { :with => FILEPATH_REGEX }
|
|
24
24
|
|
|
@@ -14,8 +14,7 @@ module ForemanPipeline
|
|
|
14
14
|
belongs_to :environment, :class_name => 'Katello::KTEnvironment'
|
|
15
15
|
|
|
16
16
|
has_many :job_jenkins_projects, :dependent => :destroy
|
|
17
|
-
has_many :jenkins_projects, :through => :job_jenkins_projects, :class_name => 'ForemanPipeline::JenkinsProject'
|
|
18
|
-
|
|
17
|
+
has_many :jenkins_projects, :through => :job_jenkins_projects, :class_name => 'ForemanPipeline::JenkinsProject'
|
|
19
18
|
has_many :content_view_repositories, :class_name=> 'Katello::ContentViewRepository',
|
|
20
19
|
:primary_key => :content_view_id, :foreign_key => :content_view_id
|
|
21
20
|
has_many :repositories, :through => :content_view_repositories
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
+
require 'foreman_pipeline/monkeys'
|
|
2
|
+
require 'bastion'
|
|
3
|
+
require 'katello'
|
|
4
|
+
require 'net/ssh'
|
|
5
|
+
require 'net/scp'
|
|
6
|
+
|
|
1
7
|
module ForemanPipeline
|
|
2
8
|
class Engine < ::Rails::Engine
|
|
3
9
|
isolate_namespace ForemanPipeline
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
require 'net/scp'
|
|
10
|
+
|
|
11
|
+
initializer 'foreman_pipeline.assets_dispatcher', :before => :build_middleware_stack do |app|
|
|
12
|
+
app.middleware.use ::ActionDispatch::Static, "#{ForemanPipeline::Engine.root}/app/assets/javascripts/foreman_pipeline"
|
|
13
|
+
end
|
|
9
14
|
|
|
10
15
|
initializer 'foreman_pipeline.mount_engine', :after => :build_middleware_stack do |app|
|
|
11
16
|
app.routes_reloader.paths << "#{ForemanPipeline::Engine.root}/config/mount_engine.rb"
|
|
@@ -19,17 +24,24 @@ module ForemanPipeline
|
|
|
19
24
|
app.config.autoload_paths += Dir["#{config.root}/app/views/foreman"]
|
|
20
25
|
end
|
|
21
26
|
|
|
22
|
-
initializer 'foreman_pipeline.register_plugin', :
|
|
27
|
+
initializer 'foreman_pipeline.register_plugin', :before => :finisher_hook do
|
|
23
28
|
require 'foreman_pipeline/plugin'
|
|
24
29
|
require 'foreman_pipeline/permissions'
|
|
25
30
|
require 'foreman_pipeline/roles'
|
|
31
|
+
require 'foreman_pipeline/skip_tests'
|
|
26
32
|
end
|
|
27
33
|
|
|
28
|
-
initializer 'foreman_pipeline.assets'
|
|
34
|
+
initializer 'foreman_pipeline.assets.precompile' do |app|
|
|
35
|
+
app.config.assets.precompile += %w(foreman_pipeline/foreman_pipeline.js
|
|
36
|
+
foreman_pipeline/foreman_pipeline.css)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
initializer 'foreman_pipeline.configure_assets', :group => :assets do |app|
|
|
29
40
|
SETTINGS[:foreman_pipeline] = {
|
|
30
41
|
:assets => {
|
|
31
42
|
:precompile => [
|
|
32
|
-
'foreman_pipeline/foreman_pipeline.js'
|
|
43
|
+
'foreman_pipeline/foreman_pipeline.js',
|
|
44
|
+
'foreman_pipeline/foreman_pipeline.css'
|
|
33
45
|
]
|
|
34
46
|
}
|
|
35
47
|
}
|
|
@@ -68,6 +80,7 @@ module ForemanPipeline
|
|
|
68
80
|
::ComputeResource.send :include, ForemanPipeline::Concerns::ComputeResourceExtension
|
|
69
81
|
end
|
|
70
82
|
|
|
83
|
+
|
|
71
84
|
rake_tasks do
|
|
72
85
|
load "#{ForemanPipeline::Engine.root}/lib/foreman_pipeline/tasks/foreman_pipeline_seed.rake"
|
|
73
86
|
load "#{ForemanPipeline::Engine.root}/lib/foreman_pipeline/tasks/foreman_pipeline_test.rake"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Foreman::Plugin.register :foreman_pipeline do
|
|
2
|
-
requires_foreman '>= 1.
|
|
2
|
+
requires_foreman '>= 1.11'
|
|
3
3
|
|
|
4
4
|
sub_menu :top_menu, :foreman_pipeline_menu, :caption => N_('Pipeline') do
|
|
5
5
|
menu :top_menu,
|
|
@@ -7,12 +7,14 @@ Foreman::Plugin.register :foreman_pipeline do
|
|
|
7
7
|
:caption => N_("Jobs"),
|
|
8
8
|
:url => '/jobs',
|
|
9
9
|
:url_hash => {:controller => 'foreman_pipeline/api/jobs', :action => 'index'},
|
|
10
|
-
:engine => ForemanPipeline::Engine
|
|
10
|
+
:engine => ForemanPipeline::Engine,
|
|
11
|
+
:turbolinks => false
|
|
11
12
|
menu :top_menu,
|
|
12
13
|
:jenkins_instances,
|
|
13
14
|
:caption => N_("Jenkins Instances"),
|
|
14
15
|
:url => '/jenkins_instances',
|
|
15
16
|
:url_hash => {:controller => 'foreman_pipeline/api/jenkins_instances', :action => 'index'},
|
|
16
|
-
:engine => ForemanPipeline::Engine
|
|
17
|
+
:engine => ForemanPipeline::Engine,
|
|
18
|
+
:turbolinks => false
|
|
17
19
|
end
|
|
18
20
|
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require 'foreman_pipeline/plugin'
|
|
2
|
+
|
|
3
|
+
#skipping Bastion routes as they have no permissions
|
|
4
|
+
tests_to_skip = {
|
|
5
|
+
"AccessPermissionsTest" => ["route bastion/bastion/index should have a permission that grants access",
|
|
6
|
+
"route bastion/bastion/index_ie should have a permission that grants access",
|
|
7
|
+
"route katello/api/v2/host_packages/auto_complete_search should have a permission that grants access"],
|
|
8
|
+
#skipping seeds tests because katello adds its settings and we get 'unexpected invocation' for mock object
|
|
9
|
+
"SeedsTest" => ["all access permissions are created by permissions seed",
|
|
10
|
+
"doesn't add a template back that was deleted",
|
|
11
|
+
"doesn't add a template back that was renamed",
|
|
12
|
+
"don't seed location when a location already exists",
|
|
13
|
+
"don't seed organization when an org already exists",
|
|
14
|
+
"is idempotent",
|
|
15
|
+
"no audits are recorded",
|
|
16
|
+
"populates bookmarks",
|
|
17
|
+
"populates config templates",
|
|
18
|
+
"populates features",
|
|
19
|
+
"populates hidden admin users",
|
|
20
|
+
"populates installation media",
|
|
21
|
+
"populates partition tables",
|
|
22
|
+
"seed location when environment",
|
|
23
|
+
"seed location when environment SEED_LOCATION specified",
|
|
24
|
+
"seed organization when environment SEED_ORGANIZATION specified",
|
|
25
|
+
"viewer role contains all view permissions"],
|
|
26
|
+
"SeedsTest::populating an initial admin user" => ["with defaults",
|
|
27
|
+
"with environment overrides"],
|
|
28
|
+
"LocationTest" => ["selected_or_inherited_ids for inherited location",
|
|
29
|
+
"used_and_selected_or_inherited_ids for inherited location"],
|
|
30
|
+
"OrganizationTest" => ["name can be the same if parent is different",
|
|
31
|
+
".my_organizations returns user's associated orgs and children"],
|
|
32
|
+
#parent_id for organization is disabled by default
|
|
33
|
+
"TaxonomixTest" => [".used_organization_ids can work with array of organizations"],
|
|
34
|
+
#bunch of broken tests, various causes
|
|
35
|
+
"UserTest" => ["when a user logs in, last login time should be updated",
|
|
36
|
+
"return organization and child ids for non-admin user",
|
|
37
|
+
"#ensure_last_admin_is_not_deleted with non-admins",
|
|
38
|
+
"can search users by role id"],
|
|
39
|
+
"UsergroupTest" => ["delete user if not in LDAP directory",
|
|
40
|
+
"add user if in LDAP directory",
|
|
41
|
+
"hosts should be retrieved from recursive/complex usergroup definitions",
|
|
42
|
+
"cannot be destroyed when in use by a host",
|
|
43
|
+
"add_users is case insensitive and does not add nonexistent users",
|
|
44
|
+
"remove users removes user list and is case insensitive"],
|
|
45
|
+
|
|
46
|
+
"Api::TestableControllerTest::errors" => ["top level key is error, no metadata included"],
|
|
47
|
+
"Api::V1::ComputeResourcesControllerTest" => ["should get index of owned"],
|
|
48
|
+
"Api::V1::ConfigTemplatesControllerTest" => ["should get template detail", "should create valid"],
|
|
49
|
+
"Api::V1::HostsControllerTest" => ["should not list a host out of users hosts scope"],
|
|
50
|
+
"Api::V1::ReportsControllerTest" => ["should get last report", "should get last report for given host only"],
|
|
51
|
+
"Api::V1::RolesControllerTest" => ["should get index"],
|
|
52
|
+
"Api::V1::SmartProxiesControllerTest" => ["should get index filtered by type"],
|
|
53
|
+
"Api::V2::HostsControllerTest::BMC proxy operations" => ["power call to interface",
|
|
54
|
+
"wrong power call fails gracefully",
|
|
55
|
+
"boot call to interface",
|
|
56
|
+
"wrong boot call to interface fails gracefully"],
|
|
57
|
+
"Api::V2::HostsControllerTest" => ["should show specific status hosts",
|
|
58
|
+
"should show hosts vm attributes",
|
|
59
|
+
"should disassociate host",
|
|
60
|
+
"should run puppet for specific host",
|
|
61
|
+
"non-admin user with power_host permission can boot a vm",
|
|
62
|
+
"template should return rendered template",
|
|
63
|
+
"wrong template name should return not found",
|
|
64
|
+
"test_rebuild_config_optimistic",
|
|
65
|
+
"test_rebuild_config_pessimistic"],
|
|
66
|
+
"Api::V2::LocationsControllerTest" => ["object name on show can be specified"],
|
|
67
|
+
"Containers::StepsControllerTest" => ["image show doesnot load katello"],
|
|
68
|
+
"HostsControllerTest::submit actions with multiple hosts" => ["destroy"],
|
|
69
|
+
"LocationsControllerTest" => ["should delete null location",
|
|
70
|
+
"should clear the session if the user deleted their current location",
|
|
71
|
+
"should clone location with assocations"],
|
|
72
|
+
"OrganizationsControllerTest" => ["should get edit",
|
|
73
|
+
"should delete null organization",
|
|
74
|
+
"should clear the session if the user deleted their current organization",
|
|
75
|
+
"should clone organization with assocations"],
|
|
76
|
+
"UnattendedControllerTest" => ["template with hostgroup should be identified as hostgroup provisioning"]
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
Foreman::Plugin.find(:foreman_pipeline).send :tests_to_skip, tests_to_skip
|
metadata
CHANGED
|
@@ -1,99 +1,43 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: foreman_pipeline
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.10
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ondřej Pražák
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2016-04-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: foreman_deployments
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - ~>
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0.0.1
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - ~>
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: 0.0.1
|
|
27
13
|
- !ruby/object:Gem::Dependency
|
|
28
14
|
name: jenkins_api_client
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
|
30
16
|
requirements:
|
|
31
|
-
- - ~>
|
|
17
|
+
- - "~>"
|
|
32
18
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: 1.4
|
|
19
|
+
version: '1.4'
|
|
34
20
|
type: :runtime
|
|
35
21
|
prerelease: false
|
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
23
|
requirements:
|
|
38
|
-
- - ~>
|
|
24
|
+
- - "~>"
|
|
39
25
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: 1.4
|
|
41
|
-
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: katello
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - ! '>='
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: 2.4.0.rc2
|
|
48
|
-
type: :runtime
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - ! '>='
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: 2.4.0.rc2
|
|
26
|
+
version: '1.4'
|
|
55
27
|
- !ruby/object:Gem::Dependency
|
|
56
28
|
name: bastion
|
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
|
58
30
|
requirements:
|
|
59
|
-
- - ~>
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '2.0'
|
|
62
|
-
type: :runtime
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - ~>
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '2.0'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: net-ssh
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ~>
|
|
31
|
+
- - "~>"
|
|
74
32
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '
|
|
33
|
+
version: '3.0'
|
|
76
34
|
type: :runtime
|
|
77
35
|
prerelease: false
|
|
78
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
37
|
requirements:
|
|
80
|
-
- - ~>
|
|
38
|
+
- - "~>"
|
|
81
39
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: net-scp
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - ~>
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: '1.1'
|
|
90
|
-
type: :runtime
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - ~>
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: '1.1'
|
|
40
|
+
version: '3.0'
|
|
97
41
|
description: Jenkins is able to deploy artifacts onto newly provisioned host by Foreman
|
|
98
42
|
email:
|
|
99
43
|
- oprazak@redhat.com
|
|
@@ -188,7 +132,6 @@ files:
|
|
|
188
132
|
- app/lib/actions/foreman_pipeline/jenkins/list.rb
|
|
189
133
|
- app/lib/actions/foreman_pipeline/jenkins/wait_and_poll.rb
|
|
190
134
|
- app/lib/actions/foreman_pipeline/jenkins/wait_for_build.rb
|
|
191
|
-
- app/lib/actions/foreman_pipeline/jenkins/wait_host_ready.rb
|
|
192
135
|
- app/lib/actions/foreman_pipeline/jenkins_instance/abstract_jenkins_instance_action.rb
|
|
193
136
|
- app/lib/actions/foreman_pipeline/jenkins_instance/create_jenkins_instance_keys.rb
|
|
194
137
|
- app/lib/actions/foreman_pipeline/job/create_activation_key.rb
|
|
@@ -203,7 +146,7 @@ files:
|
|
|
203
146
|
- app/lib/actions/foreman_pipeline/job/redeploy.rb
|
|
204
147
|
- app/lib/actions/foreman_pipeline/job/repo_sync_job_hook.rb
|
|
205
148
|
- app/lib/actions/foreman_pipeline/job/run_job_manually.rb
|
|
206
|
-
- app/lib/actions/foreman_pipeline/job/
|
|
149
|
+
- app/lib/actions/foreman_pipeline/job/wait_until_provisioned.rb
|
|
207
150
|
- app/lib/actions/foreman_pipeline/mixins/ssh_extension.rb
|
|
208
151
|
- app/lib/actions/foreman_pipeline/mixins/uri_extension.rb
|
|
209
152
|
- app/lib/foreman_pipeline/api/rendering.rb
|
|
@@ -289,6 +232,7 @@ files:
|
|
|
289
232
|
- db/migrate/20150923073033_drop_orphaned_table.rb
|
|
290
233
|
- lib/foreman_pipeline.rb
|
|
291
234
|
- lib/foreman_pipeline/engine.rb
|
|
235
|
+
- lib/foreman_pipeline/monkeys.rb
|
|
292
236
|
- lib/foreman_pipeline/permissions.rb
|
|
293
237
|
- lib/foreman_pipeline/permissions/jenkins_instance_permissions.rb
|
|
294
238
|
- lib/foreman_pipeline/permissions/jenkins_project_params_permissions.rb
|
|
@@ -298,6 +242,7 @@ files:
|
|
|
298
242
|
- lib/foreman_pipeline/permissions/job_permissions.rb
|
|
299
243
|
- lib/foreman_pipeline/plugin.rb
|
|
300
244
|
- lib/foreman_pipeline/roles.rb
|
|
245
|
+
- lib/foreman_pipeline/skip_tests.rb
|
|
301
246
|
- lib/foreman_pipeline/tasks/foreman_pipeline_seed.rake
|
|
302
247
|
- lib/foreman_pipeline/tasks/foreman_pipeline_test.rake
|
|
303
248
|
- lib/foreman_pipeline/version.rb
|
|
@@ -317,17 +262,17 @@ require_paths:
|
|
|
317
262
|
- lib
|
|
318
263
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
319
264
|
requirements:
|
|
320
|
-
- -
|
|
265
|
+
- - ">="
|
|
321
266
|
- !ruby/object:Gem::Version
|
|
322
267
|
version: '0'
|
|
323
268
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
324
269
|
requirements:
|
|
325
|
-
- -
|
|
270
|
+
- - ">="
|
|
326
271
|
- !ruby/object:Gem::Version
|
|
327
272
|
version: '0'
|
|
328
273
|
requirements: []
|
|
329
274
|
rubyforge_project:
|
|
330
|
-
rubygems_version: 2.4.
|
|
275
|
+
rubygems_version: 2.4.6
|
|
331
276
|
signing_key:
|
|
332
277
|
specification_version: 4
|
|
333
278
|
summary: Makes Foreman talk to Jenkins CI server.
|
|
@@ -335,6 +280,7 @@ test_files:
|
|
|
335
280
|
- test/factories/hostgroup_factory.rb
|
|
336
281
|
- test/factories/jenkins_instance_related_factory.rb
|
|
337
282
|
- test/foreman_pipeline_plugin_test_helper.rb
|
|
338
|
-
- test/unit/sanity_test.rb
|
|
339
283
|
- test/unit/jenkins_instance_test.rb
|
|
284
|
+
- test/unit/sanity_test.rb
|
|
340
285
|
- test/unit/job_test.rb
|
|
286
|
+
has_rdoc:
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
module Actions
|
|
2
|
-
module ForemanPipeline
|
|
3
|
-
module Jenkins
|
|
4
|
-
class WaitHostReady < WaitAndPoll
|
|
5
|
-
include Mixins::SshExtension
|
|
6
|
-
|
|
7
|
-
private
|
|
8
|
-
|
|
9
|
-
def poll_external_task
|
|
10
|
-
status = nil
|
|
11
|
-
ip = Socket::getaddrinfo(input[:jenkins_instance_hostname], 'www', nil, Socket::SOCK_STREAM)[0][3]
|
|
12
|
-
Net::SSH.start(ip, 'root', :keys => [input.fetch(:cert_path)]) do |ssh|
|
|
13
|
-
status = ssh_exec!(ssh, command)
|
|
14
|
-
end
|
|
15
|
-
output[:jenkins_ip] = ip
|
|
16
|
-
output[:status] = status
|
|
17
|
-
status[2].to_i == 0
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def command
|
|
21
|
-
c = []
|
|
22
|
-
c << "sudo -u jenkins ssh -i #{input[:jenkins_home]}/.ssh/#{input[:jenkins_instance_hostname]} -o StrictHostKeyChecking=no root@#{input[:host_ip]}"
|
|
23
|
-
c << "'echo"
|
|
24
|
-
c << echo
|
|
25
|
-
c << "'"
|
|
26
|
-
c.join(" ")
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def echo
|
|
30
|
-
'"host ready yet?"'
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
module Actions
|
|
2
|
-
module ForemanPipeline
|
|
3
|
-
module Job
|
|
4
|
-
class SuspendUntilProvisioned < ::ForemanDeployments::Tasks::WaitUntilBuiltTaskDefinition::Action
|
|
5
|
-
include ::Dynflow::Action::Cancellable
|
|
6
|
-
|
|
7
|
-
def done?
|
|
8
|
-
output[:task][:build]
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|