diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 66b641c432..7fac7b37dc 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -86,6 +86,10 @@ "Comment": "v0.1.0-21-g0bbddae", "Rev": "0bbddae09c5a5419a8c6dcdd7ff90da3d450393b" }, + { + "ImportPath": "github.com/docker/leadership", + "Rev": "b545f2df5f5cd35a54c5a6bf154dcfe1f29d125b" + }, { "ImportPath": "github.com/docker/libkv", "Comment": "v0.1.0-6-g2f2380c", diff --git a/Godeps/_workspace/src/github.com/docker/leadership/CONTRIBUTING.md b/Godeps/_workspace/src/github.com/docker/leadership/CONTRIBUTING.md new file mode 100644 index 0000000000..926dcc931d --- /dev/null +++ b/Godeps/_workspace/src/github.com/docker/leadership/CONTRIBUTING.md @@ -0,0 +1,55 @@ +# Contributing to Docker + +### Sign your work + +The sign-off is a simple line at the end of the explanation for the patch. Your +signature certifies that you wrote the patch or otherwise have the right to pass +it on as an open-source patch. The rules are pretty simple: if you can certify +the below (from [developercertificate.org](http://developercertificate.org/)): + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +Then you just add a line to every git commit message: + + Signed-off-by: Joe Smith + +Use your real name (sorry, no pseudonyms or anonymous contributions.) + +If you set your `user.name` and `user.email` git configs, you can sign your +commit automatically with `git commit -s`. diff --git a/Godeps/_workspace/src/github.com/docker/leadership/LICENSE b/Godeps/_workspace/src/github.com/docker/leadership/LICENSE new file mode 100644 index 0000000000..b55b37bc31 --- /dev/null +++ b/Godeps/_workspace/src/github.com/docker/leadership/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2015 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Godeps/_workspace/src/github.com/docker/leadership/MAINTAINERS b/Godeps/_workspace/src/github.com/docker/leadership/MAINTAINERS new file mode 100644 index 0000000000..63246e5eca --- /dev/null +++ b/Godeps/_workspace/src/github.com/docker/leadership/MAINTAINERS @@ -0,0 +1,27 @@ +# leadership maintainers file +# +# This file describes who runs the docker/leadership project and how. +# This is a living document - if you see something out of date or missing, speak up! +# +# It is structured to be consumable by both humans and programs. +# To extract its contents programmatically, use any TOML-compliant parser. +# +# This file is compiled into the MAINTAINERS file in docker/opensource. +# +[Org] + [Org."Core maintainers"] + people = [ + "abronan", + ] + +[people] + +# A reference list of all people associated with the project. +# All other sections should refer to people by their canonical key +# in the people section. + + # ADD YOURSELF HERE IN ALPHABETICAL ORDER + [people.abronan] + Name = "Alexandre Beslic" + Email = "alexandre.beslic@gmail.com" + GitHub = "abronan" diff --git a/leadership/README.md b/Godeps/_workspace/src/github.com/docker/leadership/README.md similarity index 93% rename from leadership/README.md rename to Godeps/_workspace/src/github.com/docker/leadership/README.md index 8b33c2a31b..f97eefdf18 100644 --- a/leadership/README.md +++ b/Godeps/_workspace/src/github.com/docker/leadership/README.md @@ -3,7 +3,7 @@ Leadership is a library for a cluster leader election on top of a distributed Key/Value store. -It's built using Swarm's `pkg/store` and is designed to work across multiple +It is built using the `docker/libkv` library and is designed to work across multiple storage backends. You can use `leadership` with `Consul`, `etcd` and `Zookeeper`. @@ -108,3 +108,7 @@ func run(candidate *leadership.Candidate) { } } ``` + +## License + +leadership is licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for the full license text. diff --git a/leadership/candidate.go b/Godeps/_workspace/src/github.com/docker/leadership/candidate.go similarity index 100% rename from leadership/candidate.go rename to Godeps/_workspace/src/github.com/docker/leadership/candidate.go diff --git a/leadership/follower.go b/Godeps/_workspace/src/github.com/docker/leadership/follower.go similarity index 100% rename from leadership/follower.go rename to Godeps/_workspace/src/github.com/docker/leadership/follower.go diff --git a/cli/manage.go b/cli/manage.go index 52a74f12c7..1233f65767 100644 --- a/cli/manage.go +++ b/cli/manage.go @@ -13,12 +13,12 @@ import ( "github.com/codegangsta/cli" "github.com/docker/docker/pkg/discovery" kvdiscovery "github.com/docker/docker/pkg/discovery/kv" + "github.com/docker/leadership" "github.com/docker/swarm/api" "github.com/docker/swarm/cluster" "github.com/docker/swarm/cluster/mesos" "github.com/docker/swarm/cluster/swarm" "github.com/docker/swarm/experimental" - "github.com/docker/swarm/leadership" "github.com/docker/swarm/scheduler" "github.com/docker/swarm/scheduler/filter" "github.com/docker/swarm/scheduler/strategy" diff --git a/leadership/candidate_test.go b/leadership/candidate_test.go deleted file mode 100644 index d29b433874..0000000000 --- a/leadership/candidate_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package leadership - -import ( - "testing" - "time" - - libkvmock "github.com/docker/libkv/store/mock" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" -) - -func TestCandidate(t *testing.T) { - kv, err := libkvmock.New([]string{}, nil) - assert.NoError(t, err) - assert.NotNil(t, kv) - - mockStore := kv.(*libkvmock.Mock) - mockLock := &libkvmock.Lock{} - mockStore.On("NewLock", "test_key", mock.Anything).Return(mockLock, nil) - - // Lock and unlock always succeeds. - lostCh := make(chan struct{}) - var mockLostCh <-chan struct{} = lostCh - mockLock.On("Lock", mock.Anything).Return(mockLostCh, nil) - mockLock.On("Unlock").Return(nil) - - candidate := NewCandidate(kv, "test_key", "test_node", 0) - electedCh, _, err := candidate.RunForElection() - assert.Nil(t, err) - - // Should issue a false upon start, no matter what. - assert.False(t, <-electedCh) - - // Since the lock always succeeeds, we should get elected. - assert.True(t, <-electedCh) - assert.True(t, candidate.IsLeader()) - - // Signaling a lost lock should get us de-elected... - close(lostCh) - assert.False(t, <-electedCh) - - // And we should attempt to get re-elected again. - assert.True(t, <-electedCh) - - // When we resign, unlock will get called, we'll be notified of the - // de-election and we'll try to get the lock again. - go candidate.Resign() - assert.False(t, <-electedCh) - assert.True(t, <-electedCh) - - candidate.Stop() - - // Ensure that the chan closes after some time - for { - select { - case _, open := <-electedCh: - if !open { - mockStore.AssertExpectations(t) - return - } - case <-time.After(1 * time.Second): - t.Fatalf("electedCh not closed correctly") - } - } -} diff --git a/leadership/follower_test.go b/leadership/follower_test.go deleted file mode 100644 index 9483252512..0000000000 --- a/leadership/follower_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package leadership - -import ( - "testing" - - "github.com/docker/libkv/store" - libkvmock "github.com/docker/libkv/store/mock" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" -) - -func TestFollower(t *testing.T) { - kv, err := libkvmock.New([]string{}, nil) - assert.NoError(t, err) - assert.NotNil(t, kv) - - mockStore := kv.(*libkvmock.Mock) - - kvCh := make(chan *store.KVPair) - var mockKVCh <-chan *store.KVPair = kvCh - mockStore.On("Watch", "test_key", mock.Anything).Return(mockKVCh, nil) - - follower := NewFollower(kv, "test_key") - leaderCh, errCh, err := follower.FollowElection() - assert.Nil(t, err) - - // Simulate leader updates - go func() { - kvCh <- &store.KVPair{Key: "test_key", Value: []byte("leader1")} - kvCh <- &store.KVPair{Key: "test_key", Value: []byte("leader1")} - kvCh <- &store.KVPair{Key: "test_key", Value: []byte("leader2")} - kvCh <- &store.KVPair{Key: "test_key", Value: []byte("leader1")} - }() - - // We shouldn't see duplicate events. - assert.Equal(t, <-leaderCh, "leader1") - assert.Equal(t, <-leaderCh, "leader2") - assert.Equal(t, <-leaderCh, "leader1") - assert.Equal(t, follower.Leader(), "leader1") - - // Once stopped, iteration over the leader channel should stop. - follower.Stop() - close(kvCh) - - // Assert that we receive an error from the error chan to deal with the failover - err, open := <-errCh - assert.True(t, open) - assert.NotNil(t, err) - - // Ensure that the chan is closed - _, open = <-leaderCh - assert.False(t, open) - - mockStore.AssertExpectations(t) -}