|
264 | 264 | '''
|
265 | 265 |
|
266 | 266 |
|
| 267 | +COMPARE_CONFIG_CMD = ['/usr/local/bin/kolla_set_configs', '--check'] |
| 268 | + |
| 269 | + |
267 | 270 | def get_docker_client():
|
268 | 271 | return docker.APIClient
|
269 | 272 |
|
@@ -348,7 +351,9 @@ def get_container_info(self):
|
348 | 351 |
|
349 | 352 | def compare_container(self):
|
350 | 353 | container = self.check_container()
|
351 |
| - if not container or self.check_container_differs(): |
| 354 | + if (not container or |
| 355 | + self.check_container_differs() or |
| 356 | + self.compare_config()): |
352 | 357 | self.changed = True
|
353 | 358 | return self.changed
|
354 | 359 |
|
@@ -614,6 +619,43 @@ def compare_healthcheck(self, container_info):
|
614 | 619 | if current_healthcheck:
|
615 | 620 | return True
|
616 | 621 |
|
| 622 | + def compare_config(self): |
| 623 | + try: |
| 624 | + job = self.dc.exec_create( |
| 625 | + self.params['name'], |
| 626 | + COMPARE_CONFIG_CMD, |
| 627 | + user='root', |
| 628 | + ) |
| 629 | + output = self.dc.exec_start(job) |
| 630 | + exec_inspect = self.dc.exec_inspect(job) |
| 631 | + except docker.errors.APIError as e: |
| 632 | + # NOTE(yoctozepto): If we have a client error, then the container |
| 633 | + # cannot be used for config check (e.g., is restarting, or stopped |
| 634 | + # in the mean time) - assume config is stale = return True. |
| 635 | + # Else, propagate the server error back. |
| 636 | + if e.is_client_error(): |
| 637 | + return True |
| 638 | + else: |
| 639 | + raise |
| 640 | + # Exit codes: |
| 641 | + # 0: not changed |
| 642 | + # 1: changed |
| 643 | + # 137: abrupt exit -> changed |
| 644 | + # else: error |
| 645 | + if exec_inspect['ExitCode'] == 0: |
| 646 | + return False |
| 647 | + elif exec_inspect['ExitCode'] == 1: |
| 648 | + return True |
| 649 | + elif exec_inspect['ExitCode'] == 137: |
| 650 | + # NOTE(yoctozepto): This is Docker's command exit due to container |
| 651 | + # exit. It means the container is unstable so we are better off |
| 652 | + # marking it as requiring a restart due to config update. |
| 653 | + return True |
| 654 | + else: |
| 655 | + raise Exception('Failed to compare container configuration: ' |
| 656 | + 'ExitCode: %s Message: %s' % |
| 657 | + (exec_inspect['ExitCode'], output)) |
| 658 | + |
617 | 659 | def parse_image(self):
|
618 | 660 | full_image = self.params.get('image')
|
619 | 661 |
|
|
0 commit comments