github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/jujud/agent/machine/manifolds_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package machine_test 5 6 import ( 7 "sort" 8 9 "github.com/juju/collections/set" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 "gopkg.in/juju/worker.v1" 13 "gopkg.in/juju/worker.v1/dependency" 14 15 "github.com/juju/juju/cmd/jujud/agent/agenttest" 16 "github.com/juju/juju/cmd/jujud/agent/machine" 17 "github.com/juju/juju/testing" 18 "github.com/juju/juju/worker/gate" 19 ) 20 21 type ManifoldsSuite struct { 22 testing.BaseSuite 23 } 24 25 var _ = gc.Suite(&ManifoldsSuite{}) 26 27 func (s *ManifoldsSuite) SetUpTest(c *gc.C) { 28 s.BaseSuite.SetUpTest(c) 29 } 30 31 func (*ManifoldsSuite) TestStartFuncs(c *gc.C) { 32 manifolds := machine.Manifolds(machine.ManifoldsConfig{ 33 Agent: &mockAgent{}, 34 }) 35 for name, manifold := range manifolds { 36 c.Logf("checking %q manifold", name) 37 c.Check(manifold.Start, gc.NotNil) 38 } 39 } 40 41 func (*ManifoldsSuite) TestManifoldNames(c *gc.C) { 42 manifolds := machine.Manifolds(machine.ManifoldsConfig{ 43 Agent: &mockAgent{}, 44 }) 45 keys := make([]string, 0, len(manifolds)) 46 for k := range manifolds { 47 keys = append(keys, k) 48 } 49 sort.Strings(keys) 50 expectedKeys := []string{ 51 "agent", 52 "api-address-updater", 53 "api-caller", 54 "api-config-watcher", 55 "api-server", 56 "audit-config-updater", 57 "central-hub", 58 "certificate-updater", 59 "certificate-watcher", 60 "clock", 61 "controller-port", 62 "disk-manager", 63 "external-controller-updater", 64 "fan-configurer", 65 "global-clock-updater", 66 "host-key-reporter", 67 "http-server", 68 "http-server-args", 69 "is-controller-flag", 70 "is-primary-controller-flag", 71 "lease-clock-updater", 72 "lease-manager", 73 "legacy-leases-flag", 74 "log-pruner", 75 "log-sender", 76 "logging-config-updater", 77 "machine-action-runner", 78 "machiner", 79 "mgo-txn-resumer", 80 "migration-fortress", 81 "migration-minion", 82 "migration-inactive-flag", 83 "model-cache", 84 "model-worker-manager", 85 "peer-grouper", 86 "presence", 87 "proxy-config-updater", 88 "pubsub-forwarder", 89 "raft", 90 "raft-backstop", 91 "raft-clusterer", 92 "raft-forwarder", 93 "raft-leader-flag", 94 "raft-transport", 95 "reboot-executor", 96 "restore-watcher", 97 "serving-info-setter", 98 "ssh-authkeys-updater", 99 "ssh-identity-writer", 100 "state", 101 "state-config-watcher", 102 "storage-provisioner", 103 "termination-signal-handler", 104 "tools-version-checker", 105 "transaction-pruner", 106 "unconverted-api-workers", 107 "unit-agent-deployer", 108 "upgrade-check-flag", 109 "upgrade-check-gate", 110 "upgrade-series", 111 "upgrade-steps-flag", 112 "upgrade-steps-gate", 113 "upgrade-steps-runner", 114 "upgrader", 115 "valid-credential-flag", 116 } 117 c.Assert(keys, jc.SameContents, expectedKeys) 118 } 119 120 func (*ManifoldsSuite) TestUpgradesBlockMigration(c *gc.C) { 121 manifolds := machine.Manifolds(machine.ManifoldsConfig{ 122 Agent: &mockAgent{}, 123 }) 124 manifold, ok := manifolds["migration-fortress"] 125 c.Assert(ok, jc.IsTrue) 126 127 checkContains(c, manifold.Inputs, "upgrade-check-flag") 128 checkContains(c, manifold.Inputs, "upgrade-steps-flag") 129 } 130 131 func (*ManifoldsSuite) TestMigrationGuardsUsed(c *gc.C) { 132 exempt := set.NewStrings( 133 "agent", 134 "api-caller", 135 "api-config-watcher", 136 "api-server", 137 "audit-config-updater", 138 "certificate-updater", 139 "certificate-watcher", 140 "central-hub", 141 "clock", 142 "controller-port", 143 "global-clock-updater", 144 "http-server", 145 "http-server-args", 146 "is-controller-flag", 147 "is-primary-controller-flag", 148 "lease-clock-updater", 149 "lease-manager", 150 "legacy-leases-flag", 151 "log-forwarder", 152 "model-cache", 153 "model-worker-manager", 154 "peer-grouper", 155 "presence", 156 "pubsub-forwarder", 157 "restore-watcher", 158 "state", 159 "state-config-watcher", 160 "termination-signal-handler", 161 "migration-fortress", 162 "migration-inactive-flag", 163 "migration-minion", 164 "upgrade-check-flag", 165 "upgrade-check-gate", 166 "upgrade-series", 167 "upgrade-series-enabled", 168 "upgrade-steps-flag", 169 "upgrade-steps-gate", 170 "upgrade-steps-runner", 171 "upgrader", 172 "raft", 173 "raft-backstop", 174 "raft-clusterer", 175 "raft-forwarder", 176 "raft-leader-flag", 177 "raft-transport", 178 "valid-credential-flag", 179 ) 180 manifolds := machine.Manifolds(machine.ManifoldsConfig{ 181 Agent: &mockAgent{}, 182 }) 183 for name, manifold := range manifolds { 184 c.Logf(name) 185 if !exempt.Contains(name) { 186 checkContains(c, manifold.Inputs, "migration-fortress") 187 checkContains(c, manifold.Inputs, "migration-inactive-flag") 188 } 189 } 190 } 191 192 func (*ManifoldsSuite) TestSingularGuardsUsed(c *gc.C) { 193 manifolds := machine.Manifolds(machine.ManifoldsConfig{ 194 Agent: &mockAgent{}, 195 }) 196 controllerWorkers := set.NewStrings( 197 "certificate-watcher", 198 "audit-config-updater", 199 "is-primary-controller-flag", 200 "lease-manager", 201 "legacy-leases-flag", 202 "raft-transport", 203 ) 204 primaryControllerWorkers := set.NewStrings( 205 "external-controller-updater", 206 "log-pruner", 207 "transaction-pruner", 208 ) 209 for name, manifold := range manifolds { 210 c.Logf(name) 211 switch { 212 case controllerWorkers.Contains(name): 213 checkContains(c, manifold.Inputs, "is-controller-flag") 214 checkNotContains(c, manifold.Inputs, "is-primary-controller-flag") 215 case primaryControllerWorkers.Contains(name): 216 checkNotContains(c, manifold.Inputs, "is-controller-flag") 217 checkContains(c, manifold.Inputs, "is-primary-controller-flag") 218 default: 219 checkNotContains(c, manifold.Inputs, "is-controller-flag") 220 checkNotContains(c, manifold.Inputs, "is-primary-controller-flag") 221 } 222 } 223 } 224 225 func checkContains(c *gc.C, names []string, seek string) { 226 for _, name := range names { 227 if name == seek { 228 return 229 } 230 } 231 c.Errorf("%q not found in %v", seek, names) 232 } 233 234 func checkNotContains(c *gc.C, names []string, seek string) { 235 for _, name := range names { 236 if name == seek { 237 c.Errorf("%q found in %v", seek, names) 238 return 239 } 240 } 241 } 242 243 func (*ManifoldsSuite) TestUpgradeGates(c *gc.C) { 244 upgradeStepsLock := gate.NewLock() 245 upgradeCheckLock := gate.NewLock() 246 manifolds := machine.Manifolds(machine.ManifoldsConfig{ 247 Agent: &mockAgent{}, 248 UpgradeStepsLock: upgradeStepsLock, 249 UpgradeCheckLock: upgradeCheckLock, 250 }) 251 assertGate(c, manifolds["upgrade-steps-gate"], upgradeStepsLock) 252 assertGate(c, manifolds["upgrade-check-gate"], upgradeCheckLock) 253 } 254 255 func assertGate(c *gc.C, manifold dependency.Manifold, unlocker gate.Unlocker) { 256 w, err := manifold.Start(nil) 257 c.Assert(err, jc.ErrorIsNil) 258 defer worker.Stop(w) 259 260 var waiter gate.Waiter 261 err = manifold.Output(w, &waiter) 262 c.Assert(err, jc.ErrorIsNil) 263 264 select { 265 case <-waiter.Unlocked(): 266 c.Fatalf("expected gate to be locked") 267 default: 268 } 269 270 unlocker.Unlock() 271 272 select { 273 case <-waiter.Unlocked(): 274 default: 275 c.Fatalf("expected gate to be unlocked") 276 } 277 } 278 279 func (s *ManifoldsSuite) TestManifoldsDependencies(c *gc.C) { 280 agenttest.AssertManifoldsDependencies(c, 281 machine.Manifolds(machine.ManifoldsConfig{ 282 Agent: &mockAgent{}, 283 }), 284 expectedMachineManifoldsWithDependencies, 285 ) 286 } 287 288 var expectedMachineManifoldsWithDependencies = map[string][]string{ 289 290 "agent": {}, 291 292 "api-address-updater": { 293 "agent", 294 "api-caller", 295 "api-config-watcher", 296 "migration-fortress", 297 "migration-inactive-flag", 298 "upgrade-check-flag", 299 "upgrade-check-gate", 300 "upgrade-steps-flag", 301 "upgrade-steps-gate"}, 302 303 "api-caller": {"agent", "api-config-watcher"}, 304 305 "api-config-watcher": {"agent"}, 306 307 "api-server": { 308 "agent", 309 "audit-config-updater", 310 "central-hub", 311 "clock", 312 "controller-port", 313 "http-server-args", 314 "is-controller-flag", 315 "lease-manager", 316 "model-cache", 317 "raft-transport", 318 "restore-watcher", 319 "state", 320 "state-config-watcher", 321 "upgrade-steps-gate"}, 322 323 "audit-config-updater": { 324 "agent", 325 "is-controller-flag", 326 "state", 327 "state-config-watcher"}, 328 329 "central-hub": {"agent", "state-config-watcher"}, 330 331 "certificate-updater": { 332 "agent", 333 "state", 334 "state-config-watcher", 335 "upgrade-check-flag", 336 "upgrade-check-gate", 337 "upgrade-steps-flag", 338 "upgrade-steps-gate"}, 339 340 "certificate-watcher": { 341 "agent", 342 "is-controller-flag", 343 "state", 344 "state-config-watcher"}, 345 346 "clock": {}, 347 348 "controller-port": { 349 "agent", 350 "central-hub", 351 "state", 352 "state-config-watcher"}, 353 354 "disk-manager": { 355 "agent", 356 "api-caller", 357 "api-config-watcher", 358 "migration-fortress", 359 "migration-inactive-flag", 360 "upgrade-check-flag", 361 "upgrade-check-gate", 362 "upgrade-steps-flag", 363 "upgrade-steps-gate"}, 364 365 "external-controller-updater": { 366 "agent", 367 "api-caller", 368 "api-config-watcher", 369 "clock", 370 "is-controller-flag", 371 "is-primary-controller-flag", 372 "migration-fortress", 373 "migration-inactive-flag", 374 "state", 375 "state-config-watcher", 376 "upgrade-check-flag", 377 "upgrade-check-gate", 378 "upgrade-steps-flag", 379 "upgrade-steps-gate"}, 380 381 "fan-configurer": { 382 "agent", 383 "api-caller", 384 "api-config-watcher", 385 "migration-fortress", 386 "migration-inactive-flag", 387 "upgrade-check-flag", 388 "upgrade-check-gate", 389 "upgrade-steps-flag", 390 "upgrade-steps-gate"}, 391 392 "global-clock-updater": { 393 "agent", 394 "clock", 395 "is-controller-flag", 396 "legacy-leases-flag", 397 "state", 398 "state-config-watcher"}, 399 400 "host-key-reporter": { 401 "agent", 402 "api-caller", 403 "api-config-watcher", 404 "migration-fortress", 405 "migration-inactive-flag", 406 "upgrade-check-flag", 407 "upgrade-check-gate", 408 "upgrade-steps-flag", 409 "upgrade-steps-gate"}, 410 411 "http-server": { 412 "agent", 413 "api-server", 414 "audit-config-updater", 415 "central-hub", 416 "certificate-watcher", 417 "clock", 418 "controller-port", 419 "http-server-args", 420 "is-controller-flag", 421 "lease-manager", 422 "model-cache", 423 "raft-transport", 424 "restore-watcher", 425 "state", 426 "state-config-watcher", 427 "upgrade-steps-gate", 428 }, 429 430 "http-server-args": { 431 "agent", 432 "central-hub", 433 "clock", 434 "controller-port", 435 "state", 436 "state-config-watcher"}, 437 438 "is-controller-flag": {"agent", "state", "state-config-watcher"}, 439 440 "is-primary-controller-flag": { 441 "agent", 442 "api-caller", 443 "api-config-watcher", 444 "clock", 445 "is-controller-flag", 446 "state", 447 "state-config-watcher"}, 448 449 "lease-clock-updater": { 450 "agent", 451 "central-hub", 452 "clock", 453 "controller-port", 454 "http-server-args", 455 "is-controller-flag", 456 "lease-manager", 457 "raft", 458 "raft-forwarder", 459 "raft-leader-flag", 460 "raft-transport", 461 "state", 462 "state-config-watcher", 463 "upgrade-check-flag", 464 "upgrade-check-gate", 465 "upgrade-steps-flag", 466 "upgrade-steps-gate", 467 }, 468 469 "lease-manager": { 470 "agent", 471 "central-hub", 472 "clock", 473 "is-controller-flag", 474 "state", 475 "state-config-watcher", 476 }, 477 478 "legacy-leases-flag": { 479 "agent", 480 "is-controller-flag", 481 "state", 482 "state-config-watcher", 483 }, 484 485 "log-pruner": { 486 "agent", 487 "api-caller", 488 "api-config-watcher", 489 "clock", 490 "is-controller-flag", 491 "is-primary-controller-flag", 492 "migration-fortress", 493 "migration-inactive-flag", 494 "state", 495 "state-config-watcher", 496 "upgrade-check-flag", 497 "upgrade-check-gate", 498 "upgrade-steps-flag", 499 "upgrade-steps-gate"}, 500 501 "log-sender": { 502 "agent", 503 "api-caller", 504 "api-config-watcher", 505 "migration-fortress", 506 "migration-inactive-flag", 507 "upgrade-check-flag", 508 "upgrade-check-gate", 509 "upgrade-steps-flag", 510 "upgrade-steps-gate"}, 511 512 "logging-config-updater": { 513 "agent", 514 "api-caller", 515 "api-config-watcher", 516 "migration-fortress", 517 "migration-inactive-flag", 518 "upgrade-check-flag", 519 "upgrade-check-gate", 520 "upgrade-steps-flag", 521 "upgrade-steps-gate"}, 522 523 "machine-action-runner": { 524 "agent", 525 "api-caller", 526 "api-config-watcher", 527 "migration-fortress", 528 "migration-inactive-flag", 529 "upgrade-check-flag", 530 "upgrade-check-gate", 531 "upgrade-steps-flag", 532 "upgrade-steps-gate"}, 533 534 "machiner": { 535 "agent", 536 "api-caller", 537 "api-config-watcher", 538 "fan-configurer", 539 "migration-fortress", 540 "migration-inactive-flag", 541 "upgrade-check-flag", 542 "upgrade-check-gate", 543 "upgrade-steps-flag", 544 "upgrade-steps-gate"}, 545 546 "mgo-txn-resumer": { 547 "agent", 548 "api-caller", 549 "api-config-watcher", 550 "migration-fortress", 551 "migration-inactive-flag", 552 "upgrade-check-flag", 553 "upgrade-check-gate", 554 "upgrade-steps-flag", 555 "upgrade-steps-gate"}, 556 557 "migration-fortress": { 558 "upgrade-check-flag", 559 "upgrade-check-gate", 560 "upgrade-steps-flag", 561 "upgrade-steps-gate"}, 562 563 "migration-inactive-flag": { 564 "agent", 565 "api-caller", 566 "api-config-watcher"}, 567 568 "migration-minion": { 569 "agent", 570 "api-caller", 571 "api-config-watcher", 572 "migration-fortress", 573 "upgrade-check-flag", 574 "upgrade-check-gate", 575 "upgrade-steps-flag", 576 "upgrade-steps-gate"}, 577 578 "model-cache": { 579 "agent", 580 "state", 581 "state-config-watcher", 582 }, 583 584 "model-worker-manager": { 585 "agent", 586 "state", 587 "state-config-watcher", 588 "upgrade-check-flag", 589 "upgrade-check-gate", 590 "upgrade-steps-flag", 591 "upgrade-steps-gate"}, 592 593 "peer-grouper": { 594 "agent", 595 "central-hub", 596 "clock", 597 "controller-port", 598 "state", 599 "state-config-watcher", 600 "upgrade-check-flag", 601 "upgrade-check-gate", 602 "upgrade-steps-flag", 603 "upgrade-steps-gate"}, 604 605 "presence": {"agent", "central-hub", "state-config-watcher"}, 606 607 "proxy-config-updater": { 608 "agent", 609 "api-caller", 610 "api-config-watcher", 611 "migration-fortress", 612 "migration-inactive-flag", 613 "upgrade-check-flag", 614 "upgrade-check-gate", 615 "upgrade-steps-flag", 616 "upgrade-steps-gate"}, 617 618 "pubsub-forwarder": { 619 "agent", 620 "central-hub", 621 "state-config-watcher"}, 622 623 "raft": { 624 "agent", 625 "central-hub", 626 "clock", 627 "controller-port", 628 "http-server-args", 629 "is-controller-flag", 630 "raft-transport", 631 "state", 632 "state-config-watcher", 633 "upgrade-check-flag", 634 "upgrade-check-gate", 635 "upgrade-steps-flag", 636 "upgrade-steps-gate", 637 }, 638 639 "raft-backstop": { 640 "agent", 641 "central-hub", 642 "clock", 643 "controller-port", 644 "http-server-args", 645 "is-controller-flag", 646 "raft", 647 "raft-transport", 648 "state", 649 "state-config-watcher", 650 "upgrade-check-flag", 651 "upgrade-check-gate", 652 "upgrade-steps-flag", 653 "upgrade-steps-gate", 654 }, 655 656 "raft-clusterer": { 657 "agent", 658 "central-hub", 659 "clock", 660 "controller-port", 661 "http-server-args", 662 "is-controller-flag", 663 "raft", 664 "raft-leader-flag", 665 "raft-transport", 666 "state", 667 "state-config-watcher", 668 "upgrade-check-flag", 669 "upgrade-check-gate", 670 "upgrade-steps-flag", 671 "upgrade-steps-gate", 672 }, 673 674 "raft-forwarder": { 675 "agent", 676 "central-hub", 677 "clock", 678 "controller-port", 679 "http-server-args", 680 "is-controller-flag", 681 "raft", 682 "raft-leader-flag", 683 "raft-transport", 684 "state", 685 "state-config-watcher", 686 "upgrade-check-flag", 687 "upgrade-check-gate", 688 "upgrade-steps-flag", 689 "upgrade-steps-gate", 690 }, 691 692 "raft-leader-flag": { 693 "agent", 694 "central-hub", 695 "clock", 696 "controller-port", 697 "http-server-args", 698 "is-controller-flag", 699 "raft", 700 "raft-transport", 701 "state", 702 "state-config-watcher", 703 "upgrade-check-flag", 704 "upgrade-check-gate", 705 "upgrade-steps-flag", 706 "upgrade-steps-gate", 707 }, 708 709 "raft-transport": { 710 "agent", 711 "central-hub", 712 "clock", 713 "controller-port", 714 "http-server-args", 715 "is-controller-flag", 716 "state", 717 "state-config-watcher", 718 }, 719 720 "reboot-executor": { 721 "agent", 722 "api-caller", 723 "api-config-watcher", 724 "migration-fortress", 725 "migration-inactive-flag", 726 "upgrade-check-flag", 727 "upgrade-check-gate", 728 "upgrade-steps-flag", 729 "upgrade-steps-gate"}, 730 731 "restore-watcher": {"agent", "state", "state-config-watcher"}, 732 733 "serving-info-setter": { 734 "agent", 735 "api-caller", 736 "api-config-watcher", 737 "migration-fortress", 738 "migration-inactive-flag", 739 "upgrade-check-flag", 740 "upgrade-check-gate", 741 "upgrade-steps-flag", 742 "upgrade-steps-gate"}, 743 744 "ssh-authkeys-updater": { 745 "agent", 746 "api-caller", 747 "api-config-watcher", 748 "migration-fortress", 749 "migration-inactive-flag", 750 "upgrade-check-flag", 751 "upgrade-check-gate", 752 "upgrade-steps-flag", 753 "upgrade-steps-gate"}, 754 755 "ssh-identity-writer": { 756 "agent", 757 "api-caller", 758 "api-config-watcher", 759 "migration-fortress", 760 "migration-inactive-flag", 761 "upgrade-check-flag", 762 "upgrade-check-gate", 763 "upgrade-steps-flag", 764 "upgrade-steps-gate"}, 765 766 "state": {"agent", "state-config-watcher"}, 767 768 "state-config-watcher": {"agent"}, 769 770 "storage-provisioner": { 771 "agent", 772 "api-caller", 773 "api-config-watcher", 774 "migration-fortress", 775 "migration-inactive-flag", 776 "upgrade-check-flag", 777 "upgrade-check-gate", 778 "upgrade-steps-flag", 779 "upgrade-steps-gate", 780 "valid-credential-flag", 781 }, 782 783 "termination-signal-handler": {}, 784 785 "tools-version-checker": { 786 "agent", 787 "api-caller", 788 "api-config-watcher", 789 "migration-fortress", 790 "migration-inactive-flag", 791 "upgrade-check-flag", 792 "upgrade-check-gate", 793 "upgrade-steps-flag", 794 "upgrade-steps-gate"}, 795 796 "transaction-pruner": { 797 "agent", 798 "api-caller", 799 "api-config-watcher", 800 "clock", 801 "is-controller-flag", 802 "is-primary-controller-flag", 803 "migration-fortress", 804 "migration-inactive-flag", 805 "state", 806 "state-config-watcher", 807 "upgrade-check-flag", 808 "upgrade-check-gate", 809 "upgrade-steps-flag", 810 "upgrade-steps-gate"}, 811 812 "unconverted-api-workers": { 813 "agent", 814 "api-caller", 815 "api-config-watcher", 816 "migration-fortress", 817 "migration-inactive-flag", 818 "upgrade-check-flag", 819 "upgrade-check-gate", 820 "upgrade-steps-flag", 821 "upgrade-steps-gate"}, 822 823 "unit-agent-deployer": { 824 "agent", 825 "api-caller", 826 "api-config-watcher", 827 "migration-fortress", 828 "migration-inactive-flag", 829 "upgrade-check-flag", 830 "upgrade-check-gate", 831 "upgrade-steps-flag", 832 "upgrade-steps-gate"}, 833 834 "upgrade-check-flag": {"upgrade-check-gate"}, 835 836 "upgrade-check-gate": {}, 837 838 "upgrade-series": { 839 "agent", 840 "api-caller", 841 "api-config-watcher", 842 "migration-fortress", 843 "migration-inactive-flag", 844 "upgrade-check-flag", 845 "upgrade-check-gate", 846 "upgrade-steps-flag", 847 "upgrade-steps-gate", 848 }, 849 850 "upgrade-steps-flag": {"upgrade-steps-gate"}, 851 852 "upgrade-steps-gate": {}, 853 854 "upgrade-steps-runner": { 855 "agent", 856 "api-caller", 857 "api-config-watcher", 858 "upgrade-steps-gate"}, 859 860 "upgrader": { 861 "agent", 862 "api-caller", 863 "api-config-watcher", 864 "upgrade-check-gate", 865 "upgrade-steps-gate"}, 866 867 "valid-credential-flag": { 868 "agent", 869 "api-caller", 870 "api-config-watcher", 871 }, 872 }