blob: d28dca2bac2e346883e244f69050d2b8f888cd20 [file] [log] [blame]
Tomáš Kukrálb9957b32017-02-28 14:49:00 +01001/**
2 *
3 * Launch heat stack with basic k8s
4 * Flow parameters:
5 * STACK_TYPE Orchestration engine: heat, ''
6 * INSTALL What should be installed (k8s, openstack, ...)
Tomáš Kukrál55357d02017-02-28 22:56:45 +01007 * TEST What should be tested (k8s, openstack, ...)
Tomáš Kukrálb9957b32017-02-28 14:49:00 +01008 *
9 * Expected parameters:
10 *
11 * required for STACK_TYPE=heat
12 * HEAT_TEMPLATE_URL URL to git repo with Heat templates
13 * HEAT_TEMPLATE_CREDENTIALS Credentials to the Heat templates repo
14 * HEAT_TEMPLATE_BRANCH Heat templates repo branch
15 * HEAT_STACK_TEMPLATE Heat stack HOT template
16 * HEAT_STACK_ENVIRONMENT Heat stack environmental parameters
17 * HEAT_STACK_ZONE Heat stack availability zone
18 * HEAT_STACK_PUBLIC_NET Heat stack floating IP pool
19 * HEAT_STACK_DELETE Delete Heat stack when finished (bool)
20 * HEAT_STACK_CLEANUP_JOB Name of job for deleting Heat stack
21 * HEAT_STACK_REUSE Reuse Heat stack (don't create one)
22 * OPENSTACK_API_URL OpenStack API address
23 * OPENSTACK_API_CREDENTIALS Credentials to the OpenStack API
24 * OPENSTACK_API_PROJECT OpenStack project to connect to
25 * OPENSTACK_API_CLIENT Versions of OpenStack python clients
26 * OPENSTACK_API_VERSION Version of the OpenStack API (2/3)
27 *
28 * SALT_MASTER_CREDENTIALS Credentials to the Salt API
29 *
30 * required for STACK_TYPE=NONE or empty string
31 * SALT_MASTER_URL URL of Salt-API
32
33 * K8S_API_SERVER Kubernetes API address
34 * K8S_CONFORMANCE_IMAGE Path to docker image with conformance e2e tests
35 *
36 */
37
38git = new com.mirantis.mk.Git()
39openstack = new com.mirantis.mk.Openstack()
40salt = new com.mirantis.mk.Salt()
41orchestrate = new com.mirantis.mk.Orchestrate()
42
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +010043timestamps {
44 node {
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010045
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +010046 //
47 // Prepare machines
48 //
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010049
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +010050 stage ('Create infrastructure') {
51 if (STACK_TYPE == 'heat') {
52 // value defaults
53 def openstackCloud
54 def openstackVersion = OPENSTACK_API_CLIENT ? OPENSTACK_API_CLIENT : 'liberty'
55 def openstackEnv = "${env.WORKSPACE}/venv"
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010056
57
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +010058 if (HEAT_STACK_NAME == '') {
59 HEAT_STACK_NAME = BUILD_TAG
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010060 }
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +010061
62 // get templates
63 git.checkoutGitRepository('template', HEAT_TEMPLATE_URL, HEAT_TEMPLATE_BRANCH, HEAT_TEMPLATE_CREDENTIALS)
64
65 // create openstack env
66 openstack.setupOpenstackVirtualenv(openstackEnv, openstackVersion)
67 openstackCloud = openstack.createOpenstackEnv(OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS, OPENSTACK_API_PROJECT)
68 openstack.getKeystoneToken(openstackCloud, openstackEnv)
69
70
71 // launch stack
72 if (HEAT_STACK_REUSE == 'false') {
73 stage('Launch new Heat stack') {
74 // create stack
75 envParams = [
76 'instance_zone': HEAT_STACK_ZONE,
77 'public_net': HEAT_STACK_PUBLIC_NET
78 ]
79 openstack.createHeatStack(openstackCloud, HEAT_STACK_NAME, HEAT_STACK_TEMPLATE, envParams, HEAT_STACK_ENVIRONMENT, openstackEnv)
80 }
81 }
82
83 // get SALT_MASTER_URL
84 saltMasterHost = openstack.getHeatStackOutputParam(openstackCloud, HEAT_STACK_NAME, 'salt_master_ip', openstackEnv)
85 SALT_MASTER_URL = "http://${saltMasterHost}:8088"
86 }
87 }
88
89 //
90 // Connect to Salt master
91 //
92
93 def saltMaster
94 stage('Connect to Salt API') {
95 saltMaster = salt.connection(SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
96 }
97
98 //
99 // Install
100 //
101
102 stage('Install core infrastructure') {
103 // salt.master, reclass
104 // refresh_pillar
105 // sync_all
106 // linux,openssh,salt.minion.ntp
107
108 orchestrate.installFoundationInfra(saltMaster)
109
110 if (INSTALL.toLowerCase().contains('kvm')) {
111 orchestrate.installInfraKvm(saltMaster)
Tomáš Kukrálb9957b32017-02-28 14:49:00 +0100112 }
113
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100114 orchestrate.validateFoundationInfra(saltMaster)
Tomáš Kukrál06c27a92017-03-01 16:21:46 +0100115 }
116
117
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100118 // install k8s
119 if (INSTALL.toLowerCase().contains('k8s')) {
120 stage('Install Kubernetes infra') {
121 orchestrate.installOpenstackMcpInfra(saltMaster)
122 }
123
124 stage('Install Kubernetes control') {
125 orchestrate.installOpenstackMcpControl(saltMaster)
126 }
127
Tomáš Kukrálb9957b32017-02-28 14:49:00 +0100128 }
129
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100130 // install openstack
131 if (INSTALL.toLowerCase().contains('openstack')) {
132 // install Infra and control, tests, ...
133
134 if (INSTALL.toLowerCase().contains('kvm')) {
135 physical = "true"
136 } else {
137 physical = "false"
138 }
139
140
141 stage('Install OpenStack infra') {
142 orchestrate.installOpenstackMkInfra(saltMaster, physical)
143 }
144
145 stage('Install OpenStack control') {
146 orchestrate.installOpenstackMkControl(saltMaster)
147 }
148
149 stage('Install OpenStack network') {
150 orchestrate.installOpenstackMkNetwork(saltMaster, physical)
151 }
152
153 stage('Install OpenStack compute') {
154 orchestrate.installOpenstackMkCompute(saltMaster, physical)
155 }
156
Tomáš Kukrálb9957b32017-02-28 14:49:00 +0100157 }
158
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100159 //
160 // Test
161 //
162
163 if (TEST.toLowerCase().contains('k8s')) {
164 stage('Run k8s bootstrap tests') {
165 orchestrate.runConformanceTests(saltMaster, K8S_API_SERVER, 'tomkukral/k8s-scripts')
166 }
167
168 stage('Run k8s conformance e2e tests') {
169 orchestrate.runConformanceTests(saltMaster, K8S_API_SERVER, K8S_CONFORMANCE_IMAGE)
170 }
Tomáš Kukrálb9957b32017-02-28 14:49:00 +0100171 }
172
Tomáš Kukrálb9957b32017-02-28 14:49:00 +0100173
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100174 //
175 // Clean
176 //
Tomáš Kukrálb9957b32017-02-28 14:49:00 +0100177
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100178 if (HEAT_STACK_DELETE == 'true' && STACK_TYPE == 'heat') {
179 stage('Trigger cleanup job') {
180 build job: 'deploy_heat_cleanup', parameters: [[$class: 'StringParameterValue', name: 'HEAT_STACK_NAME', value: HEAT_STACK_NAME]]
181 }
Tomáš Kukrálb9957b32017-02-28 14:49:00 +0100182 }
183 }
184}