heat_stack.yaml.j2 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179
  1. heat_template_version: {{ openshift_openstack_heat_template_version }}
  2. description: OpenShift cluster
  3. parameters:
  4. outputs:
  5. {% if openshift_openstack_resolve_heat_outputs|default(True)|bool %}
  6. etcd_names:
  7. description: Name of the etcds
  8. value: { get_attr: [ etcd, name ] }
  9. etcd_ips:
  10. description: IPs of the etcds
  11. value: { get_attr: [ etcd, private_ip ] }
  12. {% if openshift_openstack_etcd_floating_ip | default(True) | bool %}
  13. etcd_floating_ips:
  14. description: Floating IPs of the etcds
  15. value: { get_attr: [ etcd, floating_ip ] }
  16. {% endif %}
  17. master_names:
  18. description: Name of the masters
  19. value: { get_attr: [ masters, name ] }
  20. master_ips:
  21. description: IPs of the masters
  22. value: { get_attr: [ masters, private_ip ] }
  23. {% if openshift_openstack_master_floating_ip | default(True) | bool %}
  24. master_floating_ips:
  25. description: Floating IPs of the masters
  26. value: { get_attr: [ masters, floating_ip ] }
  27. {% endif %}
  28. node_names:
  29. description: Name of the nodes
  30. value: { get_attr: [ compute_nodes, name ] }
  31. node_ips:
  32. description: IPs of the nodes
  33. value: { get_attr: [ compute_nodes, private_ip ] }
  34. {% if openshift_openstack_compute_floating_ip | default(True) | bool %}
  35. node_floating_ips:
  36. description: Floating IPs of the nodes
  37. value: { get_attr: [ compute_nodes, floating_ip ] }
  38. {% endif %}
  39. infra_names:
  40. description: Name of the nodes
  41. value: { get_attr: [ infra_nodes, name ] }
  42. infra_ips:
  43. description: IPs of the nodes
  44. value: { get_attr: [ infra_nodes, private_ip ] }
  45. {% if openshift_openstack_infra_floating_ip | default(True) | bool %}
  46. infra_floating_ips:
  47. description: Floating IPs of the nodes
  48. value: { get_attr: [ infra_nodes, floating_ip ] }
  49. {% endif %}
  50. {% endif %}
  51. public_api_ip:
  52. description: IP address for the API/UI endpoint
  53. {% if openshift_openstack_use_lbaas_load_balancer and openshift_openstack_load_balancer_floating_ip %}
  54. value: { get_attr: [api_lb_floating_ip, floating_ip_address] }
  55. {% elif openshift_openstack_use_lbaas_load_balancer and not openshift_openstack_load_balancer_floating_ip %}
  56. value: { get_attr: [api_lb, vip_address] }
  57. {% elif openshift_openstack_use_vm_load_balancer %}
  58. value: { get_attr: [loadbalancer, resource.0, floating_ip] }
  59. {% else %}
  60. value: { get_attr: [masters, resource.0, floating_ip] }
  61. {% endif %}
  62. public_router_ip:
  63. description: IP address of the apps/router endpoint
  64. {% if openshift_openstack_use_lbaas_load_balancer and openshift_openstack_load_balancer_floating_ip %}
  65. value: { get_attr: [router_lb_floating_ip, floating_ip_address] }
  66. {% elif openshift_openstack_use_lbaas_load_balancer and not openshift_openstack_load_balancer_floating_ip %}
  67. value: { get_attr: [router_lb, vip_address] }
  68. {% else %}
  69. # NOTE(shadower): The VM-based loadbalancer only supports master nodes
  70. value: { get_attr: [infra_nodes, resource.0, floating_ip] }
  71. {% endif %}
  72. private_api_ip:
  73. description: >
  74. The address of the private OpenShift API. This is used during OpenShift
  75. deployment and for API access by the internal pods and services.
  76. {% if openshift_openstack_use_lbaas_load_balancer or openshift_use_kuryr|default(false)|bool %}
  77. value: { get_attr: [api_lb, vip_address] }
  78. {% elif openshift_openstack_use_vm_load_balancer %}
  79. value: { get_attr: [loadbalancer, resource.0, private_ip] }
  80. {% else %}
  81. value: { get_attr: [masters, resource.0, private_ip] }
  82. {% endif %}
  83. {% if openshift_use_kuryr|default(false)|bool %}
  84. vm_subnet:
  85. description: ID of the subnet the Pods will be on
  86. {% if not openshift_openstack_node_subnet_name %}
  87. value: { get_resource: subnet }
  88. {% else %}
  89. value: {{ openshift_openstack_node_subnet_id }}
  90. {% endif %}
  91. pod_subnet:
  92. description: ID of the subnet the Pods will be on
  93. value: { get_resource: pod_subnet }
  94. service_subnet:
  95. description: ID of the subnet the services will be on
  96. value: { get_resource: service_subnet }
  97. pod_router:
  98. description: ID of the router where the pod subnet will be connected
  99. {% if not openshift_openstack_router_name %}
  100. value: { get_resource: router }
  101. {% else %}
  102. value: {{ openshift_openstack_router_id }}
  103. {% endif %}
  104. {% if openshift_kuryr_subnet_driver|default('default') == 'namespace' %}
  105. pod_subnet_pool:
  106. description: ID of the subnet pool to use for the pod_subnets CIDRs
  107. value: { get_resource: pod_subnet_pool }
  108. {% endif %}
  109. {% if openshift_kuryr_sg_driver|default('default') == 'namespace' %}
  110. sg_allow_from_default:
  111. description: ID of the security group to enable access from default namespace
  112. value: { get_resource: sg_allow_from_default}
  113. sg_allow_from_namespace:
  114. description: ID of the security group to enable access from namespaces to default namespace
  115. value: { get_resource: sg_allow_from_namespace}
  116. {% endif %}
  117. pod_access_sg_id:
  118. description: Id of the security group for services to be able to reach pods
  119. value: { get_resource: pod_access_sg }
  120. api_lb_vip_port_id:
  121. description: Id of the OpenShift API load balancer VIP port
  122. value: { get_attr: [api_lb, vip_port_id] }
  123. api_lb_sg_id:
  124. description: Security Group Id of the OpenShift API load balancer VIP port
  125. value: { get_resource: lb-secgrp }
  126. api_lb_provider:
  127. description: Id of the OpenShift API load balancer VIP port
  128. value: { get_attr: [api_lb, show, provider] }
  129. {% endif %}
  130. conditions:
  131. no_floating: {% if openshift_openstack_provider_network_name %}true{% else %}false{% endif %}
  132. resources:
  133. # NOTE: With Kuryr, the load balancer is necessary.
  134. {% if openshift_openstack_use_lbaas_load_balancer or (openshift_use_kuryr|default(false)|bool and not openshift_openstack_provider_network_name) %}
  135. api_lb:
  136. type: OS::{{ openshift_openstack_lbaasv2_provider }}::LoadBalancer
  137. properties:
  138. name:
  139. str_replace:
  140. template: openshift-ansible-cluster_id-api-lb
  141. params:
  142. cluster_id: {{ openshift_openstack_full_dns_domain }}
  143. {% if openshift_use_kuryr|default(false)|bool %}
  144. vip_address: {{ openshift_openstack_kuryr_service_subnet_cidr | ipaddr('1') | ipaddr('address') }}
  145. vip_subnet: { get_resource: service_subnet }
  146. {% elif openshift_openstack_node_subnet_name %}
  147. vip_subnet: {{ openshift_openstack_node_subnet_name }}
  148. {% else %}
  149. vip_subnet: { get_resource: subnet }
  150. {% endif %}
  151. api_lb_listener:
  152. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Listener
  153. properties:
  154. name:
  155. str_replace:
  156. template: openshift-ansible-cluster_id-api-lb-listener
  157. params:
  158. cluster_id: {{ openshift_openstack_full_dns_domain }}
  159. loadbalancer: { get_resource: api_lb }
  160. protocol: HTTPS
  161. protocol_port: {{ openshift_master_api_port }}
  162. default_pool: { get_resource: api_lb_pool }
  163. {% if openshift_use_kuryr|default(false)|bool and openshift_master_api_port|default(8443) != 443 %}
  164. # 443 listener for pod access. In non-kuryr envs handled by iptables
  165. internal_api_lb_listener:
  166. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Listener
  167. properties:
  168. name:
  169. str_replace:
  170. template: openshift-ansible-cluster_id-api-lb-internal-listener
  171. params:
  172. cluster_id: {{ openshift_openstack_full_dns_domain }}
  173. loadbalancer: { get_resource: api_lb }
  174. protocol: HTTPS
  175. protocol_port: 443
  176. default_pool: { get_resource: api_lb_pool }
  177. {% endif %}
  178. api_lb_pool:
  179. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Pool
  180. properties:
  181. name:
  182. str_replace:
  183. template: openshift-ansible-cluster_id-api-lb-pool
  184. params:
  185. cluster_id: {{ openshift_openstack_full_dns_domain }}
  186. protocol: HTTPS
  187. # TODO(shadower): Make this configurable?
  188. lb_algorithm: ROUND_ROBIN
  189. loadbalancer: { get_resource: api_lb }
  190. {% endif %}
  191. {% if not openshift_openstack_provider_network_name %}
  192. {% if openshift_use_kuryr|default(false)|bool %}
  193. pod_net:
  194. type: OS::Neutron::Net
  195. properties:
  196. name:
  197. str_replace:
  198. template: openshift-ansible-cluster_id-pod-net
  199. params:
  200. cluster_id: {{ openshift_openstack_full_dns_domain }}
  201. {% if openshift_kuryr_subnet_driver|default('default') == 'namespace' %}
  202. pod_subnet_pool:
  203. type: OS::Neutron::SubnetPool
  204. properties:
  205. prefixes: [ {{ openshift_openstack_kuryr_pod_subnet_cidr }} ]
  206. default_prefixlen: 24
  207. name:
  208. str_replace:
  209. template: openshift-ansible-cluster_id-pod-subnet-pool
  210. params:
  211. cluster_id: {{ openshift_openstack_full_dns_domain }}
  212. {% endif %}
  213. {% if openshift_kuryr_sg_driver|default('default') == 'namespace' %}
  214. sg_allow_from_default:
  215. type: OS::Neutron::SecurityGroup
  216. properties:
  217. name:
  218. str_replace:
  219. template: openshift-ansible-cluster_id-allow_from_default
  220. params:
  221. cluster_id: {{ openshift_openstack_full_dns_domain }}
  222. description: Give access to the services and pods from the default namespace
  223. sg_allow_from_namespace:
  224. type: OS::Neutron::SecurityGroup
  225. properties:
  226. name:
  227. str_replace:
  228. template: openshift-ansible-cluster_id-allow_from_namespace
  229. params:
  230. cluster_id: {{ openshift_openstack_full_dns_domain }}
  231. description: Give access to the services and pods on the default namespace from the other namespaces
  232. rules:
  233. - ethertype: IPv4
  234. remote_group_id: { get_resource: sg_allow_from_default }
  235. remote_mode: remote_group_id
  236. sg_allow_from_default_rule:
  237. type: OS::Neutron::SecurityGroupRule
  238. properties:
  239. security_group: { get_resource: sg_allow_from_default }
  240. ethertype: IPv4
  241. remote_group: { get_resource: sg_allow_from_namespace }
  242. common-secgrp_namespace_rule:
  243. type: OS::Neutron::SecurityGroupRule
  244. properties:
  245. security_group: { get_resource: common-secgrp }
  246. ethertype: IPv4
  247. remote_group: { get_resource: sg_allow_from_namespace }
  248. common-secgrp_default_rule:
  249. type: OS::Neutron::SecurityGroupRule
  250. properties:
  251. security_group: { get_resource: common-secgrp }
  252. ethertype: IPv4
  253. remote_group: { get_resource: sg_allow_from_default }
  254. {% endif %}
  255. pod_subnet:
  256. type: OS::Neutron::Subnet
  257. properties:
  258. network_id: { get_resource: pod_net }
  259. {% if openshift_kuryr_subnet_driver|default('default') == 'namespace' %}
  260. subnetpool: { get_resource: pod_subnet_pool }
  261. {% else %}
  262. cidr: {{ openshift_openstack_kuryr_pod_subnet_cidr }}
  263. {% endif %}
  264. enable_dhcp: False
  265. name:
  266. str_replace:
  267. template: openshift-ansible-cluster_id-pod-subnet
  268. params:
  269. cluster_id: {{ openshift_openstack_full_dns_domain }}
  270. dns_nameservers:
  271. {% for nameserver in openshift_openstack_dns_nameservers %}
  272. - {{ nameserver }}
  273. {% endfor %}
  274. service_net:
  275. type: OS::Neutron::Net
  276. properties:
  277. name:
  278. str_replace:
  279. template: openshift-ansible-cluster_id-service-net
  280. params:
  281. cluster_id: {{ openshift_openstack_full_dns_domain }}
  282. service_subnet:
  283. type: OS::Neutron::Subnet
  284. properties:
  285. network_id: { get_resource: service_net }
  286. cidr: {{ openshift_openstack_kuryr_service_subnet_cidr }}
  287. gateway_ip: {{ openshift_openstack_kuryr_service_subnet_cidr | ipaddr('-2') | ipaddr('address') }}
  288. enable_dhcp: False
  289. allocation_pools:
  290. - start: {{ openshift_openstack_kuryr_service_pool_start }}
  291. end: {{ openshift_openstack_kuryr_service_pool_end }}
  292. name:
  293. str_replace:
  294. template: openshift-ansible-cluster_id-service-subnet
  295. params:
  296. cluster_id: {{ openshift_openstack_full_dns_domain }}
  297. {% endif %}
  298. {% if not openshift_openstack_node_subnet_name %}
  299. net:
  300. type: OS::Neutron::Net
  301. properties:
  302. name:
  303. str_replace:
  304. template: openshift-ansible-cluster_id-net
  305. params:
  306. cluster_id: {{ openshift_openstack_full_dns_domain }}
  307. {% endif %}
  308. {% if not openshift_openstack_node_subnet_name %}
  309. subnet:
  310. type: OS::Neutron::Subnet
  311. properties:
  312. name:
  313. str_replace:
  314. template: openshift-ansible-cluster_id-subnet
  315. params:
  316. cluster_id: {{ openshift_openstack_full_dns_domain }}
  317. network: { get_resource: net }
  318. cidr: {{ openshift_openstack_subnet_cidr }}
  319. allocation_pools:
  320. - start: {{ openshift_openstack_pool_start }}
  321. end: {{ openshift_openstack_pool_end }}
  322. dns_nameservers:
  323. {% for nameserver in openshift_openstack_dns_nameservers %}
  324. - {{ nameserver }}
  325. {% endfor %}
  326. {% endif %}
  327. {% if openshift_use_flannel|default(False)|bool %}
  328. data_net:
  329. type: OS::Neutron::Net
  330. properties:
  331. name: openshift-ansible-{{ openshift_openstack_full_dns_domain }}-data-net
  332. port_security_enabled: false
  333. data_subnet:
  334. type: OS::Neutron::Subnet
  335. properties:
  336. name: openshift-ansible-{{ openshift_openstack_full_dns_domain }}-data-subnet
  337. network: { get_resource: data_net }
  338. cidr: {{ openshift_cluster_network_cidr }}
  339. gateway_ip: null
  340. {% endif %}
  341. {% if not openshift_openstack_router_name and not openshift_openstack_node_subnet_name %}
  342. router:
  343. type: OS::Neutron::Router
  344. properties:
  345. name:
  346. str_replace:
  347. template: openshift-ansible-cluster_id-router
  348. params:
  349. cluster_id: {{ openshift_openstack_full_dns_domain }}
  350. external_gateway_info:
  351. network: {{ openshift_openstack_external_network_name }}
  352. interface:
  353. type: OS::Neutron::RouterInterface
  354. properties:
  355. router_id: { get_resource: router }
  356. subnet_id: { get_resource: subnet }
  357. {% endif %}
  358. {% if openshift_use_kuryr|default(false)|bool %}
  359. pod_subnet_interface:
  360. type: OS::Neutron::RouterInterface
  361. properties:
  362. {% if not openshift_openstack_router_name %}
  363. router_id: { get_resource: router }
  364. {% else %}
  365. router_id: {{ openshift_openstack_router_id }}
  366. {% endif %}
  367. subnet_id: { get_resource: pod_subnet }
  368. service_router_port:
  369. type: OS::Neutron::Port
  370. properties:
  371. network: { get_resource: service_net}
  372. fixed_ips:
  373. - subnet: { get_resource: service_subnet }
  374. ip_address: {{ openshift_openstack_kuryr_service_subnet_cidr | ipaddr('-2') | ipaddr('address') }}
  375. name:
  376. str_replace:
  377. template: openshift-ansible-cluster_id-service-subnet-router-port
  378. params:
  379. cluster_id: {{ openshift_openstack_full_dns_domain }}
  380. service_subnet_interface:
  381. type: OS::Neutron::RouterInterface
  382. properties:
  383. {% if not openshift_openstack_router_name %}
  384. router_id: { get_resource: router }
  385. {% else %}
  386. router_id: {{ openshift_openstack_router_id }}
  387. {% endif %}
  388. port: { get_resource: service_router_port }
  389. {% endif %}
  390. {% endif %}
  391. # keypair:
  392. # type: OS::Nova::KeyPair
  393. # properties:
  394. # name:
  395. # str_replace:
  396. # template: openshift-ansible-cluster_id-keypair
  397. # params:
  398. # cluster_id: {{ openshift_openstack_full_dns_domain }}
  399. # public_key: {{ openshift_openstack_keypair_name }}
  400. common-secgrp:
  401. type: OS::Neutron::SecurityGroup
  402. properties:
  403. name:
  404. str_replace:
  405. template: openshift-ansible-cluster_id-common-secgrp
  406. params:
  407. cluster_id: {{ openshift_openstack_full_dns_domain }}
  408. description:
  409. str_replace:
  410. template: Basic ssh/icmp security group for cluster_id OpenShift cluster
  411. params:
  412. cluster_id: {{ openshift_openstack_full_dns_domain }}
  413. rules: {{ openshift_openstack_common_secgroup_rules|to_json }}
  414. {% if openshift_use_kuryr|default(false)|bool %}
  415. pod_access_sg:
  416. type: OS::Neutron::SecurityGroup
  417. properties:
  418. name:
  419. str_replace:
  420. template: openshift-ansible-cluster_id-pod-service-secgrp
  421. params:
  422. cluster_id: {{ openshift_openstack_full_dns_domain }}
  423. description: Give services and nodes access to the pods
  424. rules:
  425. - ethertype: IPv4
  426. remote_ip_prefix: {{ openshift_openstack_kuryr_service_subnet_cidr }}
  427. - ethertype: IPv4
  428. remote_ip_prefix: {{ openshift_openstack_subnet_cidr }}
  429. {% if openshift_kuryr_sg_driver|default('default') != 'namespace' %}
  430. - ethertype: IPv4
  431. remote_mode: remote_group_id
  432. {% endif %}
  433. {% endif %}
  434. {% if openshift_openstack_flat_secgrp|default(False)|bool %}
  435. flat-secgrp:
  436. type: OS::Neutron::SecurityGroup
  437. properties:
  438. name:
  439. str_replace:
  440. template: openshift-ansible-cluster_id-flat-secgrp
  441. params:
  442. cluster_id: {{ openshift_openstack_full_dns_domain }}
  443. description:
  444. str_replace:
  445. template: Security group for cluster_id OpenShift cluster
  446. params:
  447. cluster_id: {{ openshift_openstack_full_dns_domain }}
  448. rules:
  449. {% for rule in openshift_openstack_master_secgroup_rules|list %}
  450. - {{ rule|to_json }}
  451. {% endfor %}
  452. {% for rule in openshift_openstack_etcd_secgroup_rules|list %}
  453. - {{ rule|to_json }}
  454. {% endfor %}
  455. {% for rule in openshift_openstack_node_secgroup_rules|list %}
  456. - {{ rule|to_json }}
  457. {% endfor %}
  458. {% for rule in openshift_openstack_infra_secgroup_rules|list %}
  459. - {{ rule|to_json }}
  460. {% endfor %}
  461. {% else %}
  462. master-secgrp:
  463. type: OS::Neutron::SecurityGroup
  464. properties:
  465. name:
  466. str_replace:
  467. template: openshift-ansible-cluster_id-master-secgrp
  468. params:
  469. cluster_id: {{ openshift_openstack_full_dns_domain }}
  470. description:
  471. str_replace:
  472. template: Security group for cluster_id OpenShift cluster master
  473. params:
  474. cluster_id: {{ openshift_openstack_full_dns_domain }}
  475. rules: {{ openshift_openstack_master_secgroup_rules|to_json }}
  476. etcd-secgrp:
  477. type: OS::Neutron::SecurityGroup
  478. properties:
  479. name:
  480. str_replace:
  481. template: openshift-ansible-cluster_id-etcd-secgrp
  482. params:
  483. cluster_id: {{ openshift_openstack_full_dns_domain }}
  484. description:
  485. str_replace:
  486. template: Security group for cluster_id etcd cluster
  487. params:
  488. cluster_id: {{ openshift_openstack_full_dns_domain }}
  489. rules: {{ openshift_openstack_etcd_secgroup_rules|to_json }}
  490. node-secgrp:
  491. type: OS::Neutron::SecurityGroup
  492. properties:
  493. name:
  494. str_replace:
  495. template: openshift-ansible-cluster_id-node-secgrp
  496. params:
  497. cluster_id: {{ openshift_openstack_full_dns_domain }}
  498. description:
  499. str_replace:
  500. template: Security group for cluster_id OpenShift cluster nodes
  501. params:
  502. cluster_id: {{ openshift_openstack_full_dns_domain }}
  503. rules: {{ openshift_openstack_node_secgroup_rules|to_json }}
  504. infra-secgrp:
  505. type: OS::Neutron::SecurityGroup
  506. properties:
  507. name:
  508. str_replace:
  509. template: openshift-ansible-cluster_id-infra-secgrp
  510. params:
  511. cluster_id: {{ openshift_openstack_full_dns_domain }}
  512. description:
  513. str_replace:
  514. template: Security group for cluster_id OpenShift infrastructure cluster nodes
  515. params:
  516. cluster_id: {{ openshift_openstack_full_dns_domain }}
  517. rules: {{ openshift_openstack_infra_secgroup_rules|to_json }}
  518. cns-secgrp:
  519. type: OS::Neutron::SecurityGroup
  520. properties:
  521. name:
  522. str_replace:
  523. template: openshift-ansible-cluster_id-cns-secgrp
  524. params:
  525. cluster_id: {{ openshift_openstack_full_dns_domain }}
  526. description:
  527. str_replace:
  528. template: Security group for cluster_id OpenShift cns cluster nodes
  529. params:
  530. cluster_id: {{ openshift_openstack_full_dns_domain }}
  531. rules: {{ openshift_openstack_cns_secgroup_rules|to_json }}
  532. {% endif %}
  533. lb-secgrp:
  534. type: OS::Neutron::SecurityGroup
  535. properties:
  536. name: openshift-ansible-{{ openshift_openstack_full_dns_domain }}-lb-secgrp
  537. description: Security group for {{ openshift_openstack_full_dns_domain }} cluster Load Balancer
  538. rules:
  539. {% if openshift_master_console_port is defined and openshift_master_console_port != openshift_master_api_port %}
  540. {% for rule in openshift_openstack_lb_base_secgroup_rules|list %}
  541. - {{ rule|to_json }}
  542. {% endfor %}
  543. {% for rule in openshift_openstack_lb_console_secgroup_rules|list %}
  544. - {{ rule|to_json }}
  545. {% endfor %}
  546. {% else %}
  547. {{ openshift_openstack_lb_base_secgroup_rules|to_json }}
  548. {% endif %}
  549. etcd:
  550. type: OS::Heat::ResourceGroup
  551. properties:
  552. count: {{ openshift_openstack_num_etcd }}
  553. resource_def:
  554. type: server.yaml
  555. properties:
  556. name:
  557. str_replace:
  558. template: hostname-%index%domain_suffix
  559. params:
  560. hostname: {{ openshift_openstack_etcd_hostname }}
  561. domain_suffix: {{ l_hostname_domain_suffix }}
  562. cluster_env: {{ openshift_openstack_public_dns_domain }}
  563. cluster_id: {{ openshift_openstack_full_dns_domain }}
  564. group:
  565. str_replace:
  566. template: k8s_type.cluster_id
  567. params:
  568. k8s_type: etcds
  569. cluster_id: {{ openshift_openstack_full_dns_domain }}
  570. type: etcd
  571. image: {{ openshift_openstack_etcd_image }}
  572. flavor: {{ openshift_openstack_etcd_flavor }}
  573. key_name: {{ openshift_openstack_keypair_name }}
  574. {% if openshift_openstack_provider_network_name %}
  575. net: {{ openshift_openstack_provider_network_name }}
  576. net_name: {{ openshift_openstack_provider_network_name }}
  577. {% else %}
  578. {% if openshift_openstack_node_network_id|default(false) %}
  579. net: {{ openshift_openstack_node_network_id }}
  580. {% else %}
  581. net: { get_resource: net }
  582. {% endif %}
  583. {% if openshift_openstack_node_subnet_name %}
  584. subnet: {{ openshift_openstack_node_subnet_name }}
  585. {% else %}
  586. subnet: { get_resource: subnet }
  587. {% endif %}
  588. {% if openshift_use_kuryr|default(false)|bool %}
  589. pod_net: { get_resource: pod_net }
  590. pod_subnet: { get_resource: pod_subnet }
  591. {% endif %}
  592. net_name:
  593. str_replace:
  594. template: openshift-ansible-cluster_id-net
  595. params:
  596. cluster_id: {{ openshift_openstack_full_dns_domain }}
  597. {% endif %}
  598. secgrp:
  599. - { get_resource: {% if openshift_openstack_flat_secgrp|default(False)|bool %}flat-secgrp{% else %}etcd-secgrp{% endif %} }
  600. - { get_resource: common-secgrp }
  601. {% if openshift_use_kuryr|default(false)|bool %}
  602. pod_secgrp:
  603. - { get_resource: pod_access_sg }
  604. {% endif %}
  605. floating_network:
  606. if:
  607. - no_floating
  608. - ''
  609. - {{ openshift_openstack_external_network_name }}
  610. {% if openshift_openstack_provider_network_name or not openshift_openstack_etcd_floating_ip | default(False) | bool %}
  611. attach_float_net: false
  612. {% endif %}
  613. volume_size: {{ openshift_openstack_etcd_volume_size }}
  614. {% if not openshift_openstack_provider_network_name and not openshift_openstack_node_subnet_name %}
  615. depends_on:
  616. - interface
  617. {% endif %}
  618. {% if openshift_openstack_master_server_group_policies|length > 0 %}
  619. master_server_group:
  620. type: OS::Nova::ServerGroup
  621. properties:
  622. name: master_server_group
  623. policies: {{ openshift_openstack_master_server_group_policies }}
  624. {% endif %}
  625. {% if openshift_openstack_infra_server_group_policies|length > 0 %}
  626. infra_server_group:
  627. type: OS::Nova::ServerGroup
  628. properties:
  629. name: infra_server_group
  630. policies: {{ openshift_openstack_infra_server_group_policies }}
  631. {% endif %}
  632. {% if openshift_openstack_use_vm_load_balancer %}
  633. loadbalancer:
  634. type: OS::Heat::ResourceGroup
  635. properties:
  636. count: 1
  637. resource_def:
  638. type: server.yaml
  639. properties:
  640. name:
  641. str_replace:
  642. template: hostname-%index%domain_suffix
  643. params:
  644. hostname: {{ openshift_openstack_lb_hostname }}
  645. domain_suffix: {{ l_hostname_domain_suffix }}
  646. cluster_env: {{ openshift_openstack_public_dns_domain }}
  647. cluster_id: {{ openshift_openstack_full_dns_domain }}
  648. group:
  649. str_replace:
  650. template: k8s_type.cluster_id
  651. params:
  652. k8s_type: lb
  653. cluster_id: {{ openshift_openstack_full_dns_domain }}
  654. type: lb
  655. image: {{ openshift_openstack_lb_image }}
  656. flavor: {{ openshift_openstack_lb_flavor }}
  657. key_name: {{ openshift_openstack_keypair_name }}
  658. {% if openshift_openstack_provider_network_name %}
  659. net: {{ openshift_openstack_provider_network_name }}
  660. net_name: {{ openshift_openstack_provider_network_name }}
  661. {% elif openshift_openstack_node_network_id|default(false) %}
  662. net: {{ openshift_openstack_node_network_id }}
  663. {% else %}
  664. net: { get_resource: net }
  665. {% if openshift_openstack_node_subnet_name %}
  666. subnet: {{ openshift_openstack_node_subnet_name }}
  667. {% else %}
  668. subnet: { get_resource: subnet }
  669. {% endif %}
  670. {% if openshift_use_kuryr|default(false)|bool %}
  671. pod_net: { get_resource: pod_net }
  672. pod_subnet: { get_resource: pod_subnet }
  673. {% endif %}
  674. net_name:
  675. str_replace:
  676. template: openshift-ansible-cluster_id-net
  677. params:
  678. cluster_id: {{ openshift_openstack_full_dns_domain }}
  679. {% endif %}
  680. secgrp:
  681. - { get_resource: lb-secgrp }
  682. - { get_resource: common-secgrp }
  683. {% if openshift_use_kuryr|default(false)|bool %}
  684. pod_secgrp:
  685. - { get_resource: pod_access_sg }
  686. {% endif %}
  687. floating_network:
  688. if:
  689. - no_floating
  690. - ''
  691. - {{ openshift_openstack_external_network_name }}
  692. {% if openshift_openstack_provider_network_name or not openshift_openstack_load_balancer_floating_ip | default(True) | bool %}
  693. attach_float_net: false
  694. {% endif %}
  695. volume_size: {{ openshift_openstack_lb_volume_size }}
  696. {% if not openshift_openstack_provider_network_name and not openshift_openstack_node_subnet_name %}
  697. depends_on:
  698. - interface
  699. {% endif %}
  700. {% endif %}
  701. masters:
  702. type: OS::Heat::ResourceGroup
  703. properties:
  704. count: {{ openshift_openstack_num_masters }}
  705. resource_def:
  706. type: server.yaml
  707. properties:
  708. name:
  709. str_replace:
  710. template: hostname-%index%domain_suffix
  711. params:
  712. hostname: {{ openshift_openstack_master_hostname }}
  713. domain_suffix: {{ l_hostname_domain_suffix }}
  714. cluster_env: {{ openshift_openstack_public_dns_domain }}
  715. cluster_id: {{ openshift_openstack_full_dns_domain }}
  716. group:
  717. str_replace:
  718. template: k8s_type.cluster_id
  719. params:
  720. k8s_type: masters
  721. cluster_id: {{ openshift_openstack_full_dns_domain }}
  722. type: master
  723. openshift_node_group_name: {{ openshift_openstack_master_group_name }}
  724. image: {{ openshift_openstack_master_image }}
  725. flavor: {{ openshift_openstack_master_flavor }}
  726. key_name: {{ openshift_openstack_keypair_name }}
  727. {% if openshift_openstack_use_lbaas_load_balancer or openshift_use_kuryr|default(false)|bool %}
  728. api_lb_pool: { get_resource: api_lb_pool }
  729. {% endif %}
  730. {% if openshift_openstack_provider_network_name %}
  731. net: {{ openshift_openstack_provider_network_name }}
  732. net_name: {{ openshift_openstack_provider_network_name }}
  733. {% else %}
  734. {% if openshift_openstack_node_network_id|default(false) %}
  735. net: {{ openshift_openstack_node_network_id }}
  736. {% else %}
  737. net: { get_resource: net }
  738. {% endif %}
  739. {% if openshift_openstack_node_subnet_name %}
  740. subnet: {{ openshift_openstack_node_subnet_name }}
  741. {% else %}
  742. subnet: { get_resource: subnet }
  743. {% endif %}
  744. {% if openshift_use_kuryr|default(false)|bool %}
  745. pod_net: { get_resource: pod_net }
  746. pod_subnet: { get_resource: pod_subnet }
  747. {% endif %}
  748. net_name:
  749. str_replace:
  750. template: openshift-ansible-cluster_id-net
  751. params:
  752. cluster_id: {{ openshift_openstack_full_dns_domain }}
  753. {% if openshift_use_flannel|default(False)|bool %}
  754. attach_data_net: true
  755. data_net: { get_resource: data_net }
  756. data_subnet: { get_resource: data_subnet }
  757. {% endif %}
  758. {% endif %}
  759. {% if openshift_use_kuryr|default(false)|bool %}
  760. api_lb_pool: { get_resource: api_lb_pool }
  761. {% endif %}
  762. secgrp:
  763. - { get_resource: common-secgrp }
  764. {% if openshift_openstack_flat_secgrp|default(False)|bool %}
  765. - { get_resource: flat-secgrp }
  766. {% else %}
  767. - { get_resource: master-secgrp }
  768. - { get_resource: node-secgrp }
  769. {% if openshift_openstack_num_etcd|int == 0 %}
  770. - { get_resource: etcd-secgrp }
  771. {% endif %}
  772. {% if openshift_use_kuryr|default(false)|bool %}
  773. pod_secgrp:
  774. - { get_resource: pod_access_sg }
  775. {% endif %}
  776. {% endif %}
  777. floating_network:
  778. if:
  779. - no_floating
  780. - ''
  781. - {{ openshift_openstack_external_network_name }}
  782. {% if openshift_openstack_provider_network_name or not openshift_openstack_master_floating_ip | default(False) | bool %}
  783. attach_float_net: false
  784. {% endif %}
  785. volume_size: {{ openshift_openstack_master_volume_size }}
  786. {% if openshift_openstack_master_server_group_policies|length > 0 %}
  787. scheduler_hints:
  788. group: { get_resource: master_server_group }
  789. {% endif %}
  790. {% if not openshift_openstack_provider_network_name and not openshift_openstack_node_subnet_name %}
  791. depends_on:
  792. - interface
  793. {% endif %}
  794. compute_nodes:
  795. type: OS::Heat::ResourceGroup
  796. properties:
  797. count: {{ openshift_openstack_num_nodes }}
  798. removal_policies:
  799. - resource_list: {{ openshift_openstack_nodes_to_remove | to_json }}
  800. resource_def:
  801. type: server.yaml
  802. properties:
  803. name:
  804. str_replace:
  805. template: hostname-%index%domain_suffix
  806. params:
  807. hostname: {{ openshift_openstack_node_hostname }}
  808. domain_suffix: {{ l_hostname_domain_suffix }}
  809. cluster_env: {{ openshift_openstack_public_dns_domain }}
  810. cluster_id: {{ openshift_openstack_full_dns_domain }}
  811. group:
  812. str_replace:
  813. template: k8s_type.cluster_id
  814. params:
  815. k8s_type: nodes
  816. cluster_id: {{ openshift_openstack_full_dns_domain }}
  817. type: node
  818. subtype: app
  819. openshift_node_group_name: {{ openshift_openstack_compute_group_name }}
  820. image: {{ openshift_openstack_node_image }}
  821. flavor: {{ openshift_openstack_node_flavor }}
  822. key_name: {{ openshift_openstack_keypair_name }}
  823. {% if openshift_openstack_provider_network_name %}
  824. net: {{ openshift_openstack_provider_network_name }}
  825. net_name: {{ openshift_openstack_provider_network_name }}
  826. {% else %}
  827. {% if openshift_openstack_node_network_id|default(false) %}
  828. net: {{ openshift_openstack_node_network_id }}
  829. {% else %}
  830. net: { get_resource: net }
  831. {% endif %}
  832. {% if openshift_openstack_node_subnet_name %}
  833. subnet: {{ openshift_openstack_node_subnet_name }}
  834. {% else %}
  835. subnet: { get_resource: subnet }
  836. {% endif %}
  837. {% if openshift_use_kuryr|default(false)|bool %}
  838. pod_net: { get_resource: pod_net }
  839. pod_subnet: { get_resource: pod_subnet }
  840. {% endif %}
  841. net_name:
  842. str_replace:
  843. template: openshift-ansible-cluster_id-net
  844. params:
  845. cluster_id: {{ openshift_openstack_full_dns_domain }}
  846. {% if openshift_use_flannel|default(False)|bool %}
  847. attach_data_net: true
  848. data_net: { get_resource: data_net }
  849. data_subnet: { get_resource: data_subnet }
  850. {% endif %}
  851. {% endif %}
  852. secgrp:
  853. - { get_resource: {% if openshift_openstack_flat_secgrp|default(False)|bool %}flat-secgrp{% else %}node-secgrp{% endif %} }
  854. - { get_resource: common-secgrp }
  855. {% if openshift_use_kuryr|default(false)|bool %}
  856. pod_secgrp:
  857. - { get_resource: pod_access_sg }
  858. {% endif %}
  859. floating_network:
  860. if:
  861. - no_floating
  862. - ''
  863. - {{ openshift_openstack_external_network_name }}
  864. {% if openshift_openstack_provider_network_name or not openshift_openstack_compute_floating_ip | default(False) | bool %}
  865. attach_float_net: false
  866. {% endif %}
  867. volume_size: {{ openshift_openstack_node_volume_size }}
  868. {% if not openshift_openstack_provider_network_name and not openshift_openstack_node_subnet_name %}
  869. depends_on:
  870. - interface
  871. {% endif %}
  872. infra_nodes:
  873. type: OS::Heat::ResourceGroup
  874. properties:
  875. count: {{ openshift_openstack_num_infra }}
  876. resource_def:
  877. type: server.yaml
  878. properties:
  879. name:
  880. str_replace:
  881. template: hostname-%index%domain_suffix
  882. params:
  883. hostname: {{ openshift_openstack_infra_hostname }}
  884. domain_suffix: {{ l_hostname_domain_suffix }}
  885. cluster_env: {{ openshift_openstack_public_dns_domain }}
  886. cluster_id: {{ openshift_openstack_full_dns_domain }}
  887. group:
  888. str_replace:
  889. template: k8s_type.cluster_id
  890. params:
  891. k8s_type: infra
  892. cluster_id: {{ openshift_openstack_full_dns_domain }}
  893. type: node
  894. subtype: infra
  895. openshift_node_group_name: {{ openshift_openstack_infra_group_name }}
  896. image: {{ openshift_openstack_infra_image }}
  897. flavor: {{ openshift_openstack_infra_flavor }}
  898. key_name: {{ openshift_openstack_keypair_name }}
  899. {% if openshift_openstack_use_lbaas_load_balancer %}
  900. router_lb_pool_http: { get_resource: router_lb_pool_http }
  901. router_lb_pool_https: { get_resource: router_lb_pool_https }
  902. {% endif %}
  903. {% if openshift_openstack_provider_network_name %}
  904. net: {{ openshift_openstack_provider_network_name }}
  905. net_name: {{ openshift_openstack_provider_network_name }}
  906. {% else %}
  907. {% if openshift_openstack_node_network_id|default(false) %}
  908. net: {{ openshift_openstack_node_network_id }}
  909. {% else %}
  910. net: { get_resource: net }
  911. {% endif %}
  912. {% if openshift_openstack_node_subnet_name %}
  913. subnet: {{ openshift_openstack_node_subnet_name }}
  914. {% else %}
  915. subnet: { get_resource: subnet }
  916. {% endif %}
  917. {% if openshift_use_kuryr|default(false)|bool %}
  918. pod_net: { get_resource: pod_net }
  919. pod_subnet: { get_resource: pod_subnet }
  920. {% endif %}
  921. net_name:
  922. str_replace:
  923. template: openshift-ansible-cluster_id-net
  924. params:
  925. cluster_id: {{ openshift_openstack_full_dns_domain }}
  926. {% if openshift_use_flannel|default(False)|bool %}
  927. attach_data_net: true
  928. data_net: { get_resource: data_net }
  929. data_subnet: { get_resource: data_subnet }
  930. {% endif %}
  931. {% endif %}
  932. secgrp:
  933. # TODO(bogdando) filter only required node rules into infra-secgrp
  934. - { get_resource: common-secgrp }
  935. {% if openshift_openstack_flat_secgrp|default(False)|bool %}
  936. - { get_resource: flat-secgrp }
  937. {% else %}
  938. - { get_resource: node-secgrp }
  939. - { get_resource: infra-secgrp }
  940. {% if openshift_use_kuryr|default(false)|bool %}
  941. pod_secgrp:
  942. - { get_resource: pod_access_sg }
  943. {% endif %}
  944. {% endif %}
  945. floating_network:
  946. if:
  947. - no_floating
  948. - ''
  949. - {{ openshift_openstack_external_network_name }}
  950. {% if openshift_openstack_provider_network_name or not openshift_openstack_infra_floating_ip | default(True) | bool %}
  951. attach_float_net: false
  952. {% endif %}
  953. volume_size: {{ openshift_openstack_infra_volume_size }}
  954. {% if openshift_openstack_infra_server_group_policies|length > 0 %}
  955. scheduler_hints:
  956. group: { get_resource: infra_server_group }
  957. {% endif %}
  958. {% if not openshift_openstack_provider_network_name and not openshift_openstack_node_subnet_name %}
  959. depends_on:
  960. - interface
  961. {% endif %}
  962. cns:
  963. type: OS::Heat::ResourceGroup
  964. properties:
  965. count: {{ openshift_openstack_num_cns }}
  966. resource_def:
  967. type: server.yaml
  968. properties:
  969. name:
  970. str_replace:
  971. template: hostname-%index%domain_suffix
  972. params:
  973. hostname: {{ openshift_openstack_cns_hostname }}
  974. domain_suffix: {{ l_hostname_domain_suffix }}
  975. cluster_env: {{ openshift_openstack_public_dns_domain }}
  976. cluster_id: {{ openshift_openstack_full_dns_domain }}
  977. group:
  978. str_replace:
  979. template: k8s_type.cluster_id
  980. params:
  981. k8s_type: cns
  982. cluster_id: {{ openshift_openstack_full_dns_domain }}
  983. type: cns
  984. openshift_node_group_name: node-config-compute
  985. image: {{ openshift_openstack_cns_image }}
  986. flavor: {{ openshift_openstack_cns_flavor }}
  987. key_name: {{ openshift_openstack_keypair_name }}
  988. {% if openshift_openstack_provider_network_name %}
  989. net: {{ openshift_openstack_provider_network_name }}
  990. net_name: {{ openshift_openstack_provider_network_name }}
  991. {% else %}
  992. {% if openshift_openstack_node_network_id|default(false) %}
  993. net: {{ openshift_openstack_node_network_id }}
  994. {% else %}
  995. net: { get_resource: net }
  996. {% endif %}
  997. {% if openshift_openstack_node_subnet_name %}
  998. subnet: {{ openshift_openstack_node_subnet_name }}
  999. {% else %}
  1000. subnet: { get_resource: subnet }
  1001. {% endif %}
  1002. {% if openshift_use_kuryr|default(false)|bool %}
  1003. pod_net: { get_resource: pod_net }
  1004. pod_subnet: { get_resource: pod_subnet }
  1005. {% endif %}
  1006. net_name:
  1007. str_replace:
  1008. template: openshift-ansible-cluster_id-net
  1009. params:
  1010. cluster_id: {{ openshift_openstack_full_dns_domain }}
  1011. {% if openshift_use_flannel|default(False)|bool %}
  1012. attach_data_net: true
  1013. data_net: { get_resource: data_net }
  1014. data_subnet: { get_resource: data_subnet }
  1015. {% endif %}
  1016. {% endif %}
  1017. secgrp:
  1018. - { get_resource: common-secgrp }
  1019. {% if openshift_openstack_flat_secgrp|default(False)|bool %}
  1020. - { get_resource: flat-secgrp }
  1021. {% else %}
  1022. - { get_resource: node-secgrp }
  1023. - { get_resource: cns-secgrp }
  1024. {% if openshift_use_kuryr|default(false)|bool %}
  1025. pod_secgrp:
  1026. - { get_resource: pod_access_sg }
  1027. {% endif %}
  1028. {% endif %}
  1029. {% if not openshift_openstack_provider_network_name %}
  1030. floating_network: {{ openshift_openstack_external_network_name }}
  1031. {% endif %}
  1032. volume_size: {{ openshift_openstack_cns_volume_size }}
  1033. {% if not openshift_openstack_provider_network_name and not openshift_openstack_node_subnet_name %}
  1034. depends_on:
  1035. - interface
  1036. {% endif %}
  1037. {% if openshift_openstack_use_lbaas_load_balancer %}
  1038. {% if openshift_openstack_load_balancer_floating_ip | default(True) | bool %}
  1039. api_lb_floating_ip:
  1040. condition: { not: no_floating }
  1041. depends_on:
  1042. - api_lb
  1043. - api_lb_listener
  1044. - api_lb_pool
  1045. type: OS::Neutron::FloatingIP
  1046. properties:
  1047. floating_network: {{ openshift_openstack_external_network_name }}
  1048. port_id: { get_attr: [api_lb, vip_port_id] }
  1049. {% endif %}
  1050. router_lb:
  1051. type: OS::{{ openshift_openstack_lbaasv2_provider }}::LoadBalancer
  1052. properties:
  1053. {% if openshift_openstack_node_subnet_name %}
  1054. vip_subnet: {{ openshift_openstack_node_subnet_name }}
  1055. {% else %}
  1056. vip_subnet: { get_resource: subnet }
  1057. {% endif %}
  1058. {% if openshift_openstack_load_balancer_floating_ip | default(True) | bool %}
  1059. router_lb_floating_ip:
  1060. condition: { not: no_floating }
  1061. depends_on:
  1062. - router_lb
  1063. - router_lb_listener_http
  1064. - router_lb_pool_http
  1065. - router_lb_listener_https
  1066. - router_lb_pool_https
  1067. type: OS::Neutron::FloatingIP
  1068. properties:
  1069. floating_network: {{ openshift_openstack_external_network_name }}
  1070. port_id: { get_attr: [router_lb, vip_port_id] }
  1071. {% endif %}
  1072. router_lb_listener_http:
  1073. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Listener
  1074. properties:
  1075. protocol: HTTP
  1076. protocol_port: 80
  1077. loadbalancer: { get_resource: router_lb }
  1078. router_lb_pool_http:
  1079. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Pool
  1080. properties:
  1081. # TODO(shadower): Make this configurable?
  1082. lb_algorithm: ROUND_ROBIN
  1083. protocol: HTTP
  1084. listener: { get_resource: router_lb_listener_http }
  1085. router_lb_listener_https:
  1086. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Listener
  1087. properties:
  1088. protocol: HTTPS
  1089. protocol_port: 443
  1090. loadbalancer: { get_resource: router_lb }
  1091. router_lb_pool_https:
  1092. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Pool
  1093. properties:
  1094. # TODO(shadower): Make this configurable?
  1095. lb_algorithm: ROUND_ROBIN
  1096. protocol: HTTPS
  1097. listener: { get_resource: router_lb_listener_https }
  1098. {% endif %}