|
247 | 247 | '''
|
248 | 248 |
|
249 | 249 |
|
| 250 | +COMPARE_CONFIG_CMD = ['/usr/local/bin/kolla_set_configs', '--check'] |
| 251 | + |
| 252 | + |
250 | 253 | def get_docker_client():
|
251 | 254 | return docker.APIClient
|
252 | 255 |
|
@@ -328,7 +331,9 @@ def get_container_info(self):
|
328 | 331 |
|
329 | 332 | def compare_container(self):
|
330 | 333 | container = self.check_container()
|
331 |
| - if not container or self.check_container_differs(): |
| 334 | + if (not container or |
| 335 | + self.check_container_differs() or |
| 336 | + self.compare_config()): |
332 | 337 | self.changed = True
|
333 | 338 | return self.changed
|
334 | 339 |
|
@@ -566,6 +571,43 @@ def compare_healthcheck(self, container_info):
|
566 | 571 | if current_healthcheck:
|
567 | 572 | return True
|
568 | 573 |
|
| 574 | + def compare_config(self): |
| 575 | + try: |
| 576 | + job = self.dc.exec_create( |
| 577 | + self.params['name'], |
| 578 | + COMPARE_CONFIG_CMD, |
| 579 | + user='root', |
| 580 | + ) |
| 581 | + output = self.dc.exec_start(job) |
| 582 | + exec_inspect = self.dc.exec_inspect(job) |
| 583 | + except docker.errors.APIError as e: |
| 584 | + # NOTE(yoctozepto): If we have a client error, then the container |
| 585 | + # cannot be used for config check (e.g., is restarting, or stopped |
| 586 | + # in the mean time) - assume config is stale = return True. |
| 587 | + # Else, propagate the server error back. |
| 588 | + if e.is_client_error(): |
| 589 | + return True |
| 590 | + else: |
| 591 | + raise |
| 592 | + # Exit codes: |
| 593 | + # 0: not changed |
| 594 | + # 1: changed |
| 595 | + # 137: abrupt exit -> changed |
| 596 | + # else: error |
| 597 | + if exec_inspect['ExitCode'] == 0: |
| 598 | + return False |
| 599 | + elif exec_inspect['ExitCode'] == 1: |
| 600 | + return True |
| 601 | + elif exec_inspect['ExitCode'] == 137: |
| 602 | + # NOTE(yoctozepto): This is Docker's command exit due to container |
| 603 | + # exit. It means the container is unstable so we are better off |
| 604 | + # marking it as requiring a restart due to config update. |
| 605 | + return True |
| 606 | + else: |
| 607 | + raise Exception('Failed to compare container configuration: ' |
| 608 | + 'ExitCode: %s Message: %s' % |
| 609 | + (exec_inspect['ExitCode'], output)) |
| 610 | + |
569 | 611 | def parse_image(self):
|
570 | 612 | full_image = self.params.get('image')
|
571 | 613 |
|
|
0 commit comments