Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
664b5be
Refactor appcontroller to work as long running controller
dshulyak Mar 10, 2017
45073b7
Add unit test to cover controller behaviour
dshulyak Mar 13, 2017
b88b6d3
Change run and prepare logic in e2e tests
dshulyak Mar 13, 2017
82ee0fb
Updated roadmap in readme
pigmej Mar 13, 2017
2dc2a01
Fix misc errors
dshulyak Mar 13, 2017
fec17cf
Merge pull request #215 from pigmej/readme_impr
istalker2 Mar 13, 2017
4fd6591
Bump k8s on CI to 1.5.4 and 1.4.9
pigmej Mar 13, 2017
8011cd8
Merge pull request #216 from pigmej/update_k8ss_on_ci
pigmej Mar 13, 2017
63626e4
Verify that deployment will succeed even if workflow was terminated
dshulyak Mar 14, 2017
e0a0f00
Create cfg.yaml in examples instead of ac-run
dshulyak Mar 14, 2017
a656d59
Ignore part of the label flag test
dshulyak Mar 14, 2017
c8b7afe
Change README to reflect current change
dshulyak Mar 16, 2017
9591368
Merge pull request #214 from dshulyak/longrunning
nebril Mar 16, 2017
a049044
Change patterns to work with kubeadm-dind
dshulyak Mar 21, 2017
c4cf34f
Add cluster role binding that will add serviceaccount to admin group
dshulyak Mar 21, 2017
53a2cac
Refactor CI scripts to use kubeadm-dind
dshulyak Mar 21, 2017
26e604b
Change method of comparison for kubernetes version
dshulyak Mar 22, 2017
11bbd1c
Address review comments
dshulyak Mar 22, 2017
6ecfb1b
Make job with kube 1.5 authoritative
dshulyak Mar 22, 2017
a41d3a6
Merge pull request #225 from dshulyak/updateCI
pigmej Mar 22, 2017
0fb60a2
Remove all runit related scripts
dshulyak Mar 23, 2017
88dd61e
Merge pull request #226 from dshulyak/remove_runit
jellonek Mar 23, 2017
98cb3e4
Fixed docker publish
Mar 23, 2017
12baf08
Fixed syntax
Mar 24, 2017
1523ab3
Merge pull request #228 from aarzhanov/fix_publish
dshulyak Mar 27, 2017
034b6f4
Testing k8s 1.4 on travis with go 1.7
pigmej May 8, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 6 additions & 11 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,26 +1,21 @@
sudo: required
language: go
services:
- docker
- docker
go:
- 1.6
- 1.7
env:
- WORKING=$HOME/kube1.5 K8S_TAG=v1.5.2 PUBLISH=1
- WORKING=$HOME/kube1.4 K8S_TAG=v1.4.8
- K8S_VERSION=v1.5 PUBLISH=1
- K8S_VERSION=v1.4
matrix:
exclude:
- go: 1.6
env: WORKING=$HOME/kube1.5 K8S_TAG=v1.5.2 PUBLISH=1
- go: 1.7
env: WORKING=$HOME/kube1.4 K8S_TAG=v1.4.8
cache:
directories:
- $HOME/kube1.5
- $HOME/kube1.4
env: K8S_VERSION=v1.5 PUBLISH=1
- go: 1.6
env: K8S_VERSION=v1.4
script:
- go get github.com/Masterminds/glide
- make test
- make e2e
after_success:
- make docker-publish
4 changes: 0 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,4 @@ RUN apk --no-cache add runit@community &&\
touch /etc/sv/ac/down

ADD manifests /opt/kubeac/manifests
ADD ac_service.sh /etc/sv/ac/run
ADD run_runit.sh /usr/bin/run_runit
ADD ac-run.sh /usr/bin/ac-run
ADD ac-stop.sh /usr/bin/ac-stop
ADD kubeac /usr/bin/kubeac
20 changes: 7 additions & 13 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@

IMAGE_REPO ?= mirantis/k8s-appcontroller
WORKING ?= ~/testappcontroller
K8S_SOURCE_LOCATION = .k8s-source
K8S_CLUSTER_MARKER = .k8s-cluster
K8S_TAG ?= v1.5.2
K8S_VERSION ?= v1.5

.PHONY: docker
docker: kubeac Makefile
Expand All @@ -24,12 +22,12 @@ docker-publish:

.PHONY: img-in-dind
img-in-dind: docker $(K8S_CLUSTER_MARKER)
IMAGE_REPO=$(IMAGE_REPO) bash scripts/import.sh
IMAGE_REPO=$(IMAGE_REPO) ./scripts/import.sh

.PHONY: e2e
e2e: $(K8S_CLUSTER_MARKER) img-in-dind
go test -c -o e2e.test ./e2e/
PATH=$(PATH):$(WORKING)/kubernetes/_output/bin/ ./e2e.test --cluster-url=http://0.0.0.0:8888 --k8s-version=$(K8S_TAG)
./e2e.test --cluster-url=http://0.0.0.0:8080 --k8s-version=$(K8S_VERSION)

.PHONY: clean-all
clean-all: clean clean-k8s
Expand All @@ -42,14 +40,10 @@ clean:

.PHONY: clean-k8s
clean-k8s:
WORKING=$(WORKING) scripts/dind_down.sh
<$(K8S_SOURCE_LOCATION) xargs rm -rf
-rm $(K8S_SOURCE_LOCATION)
./kubeadm-dind-cluster/fixed/dind-cluster-$(K8S_VERSION).sh clean
-rm $(K8S_CLUSTER_MARKER)

$(K8S_SOURCE_LOCATION):
WORKING=$(WORKING) scripts/checkout_k8s.sh > $(K8S_SOURCE_LOCATION)

$(K8S_CLUSTER_MARKER): $(K8S_SOURCE_LOCATION)
WORKING=$(WORKING) ./scripts/prepare_dind.sh
$(K8S_CLUSTER_MARKER):
if [ ! -d "kubeadm-dind-cluster" ]; then git clone https://github.com/Mirantis/kubeadm-dind-cluster.git; fi
./kubeadm-dind-cluster/fixed/dind-cluster-$(K8S_VERSION).sh up
touch $(K8S_CLUSTER_MARKER)
18 changes: 14 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,19 @@ Load it to k8s:

`kubectl create -f dependencies_file.yaml`

Start appcontroller process:
Create configmap to start appcontroller deployment workflow:

`kubectl exec k8s-appcontroller ac-run`
```
kind: ConfigMap
apiVersion: v1
metadata:
name: appcontrollerdeployment
data:
# limit concurrency for appcontroller
concurrency: 3
# specify label selector
selector: ""
```

You can stop appcontroller process by:

Expand Down Expand Up @@ -140,7 +150,7 @@ Here is the brief list of our mid term Roadmap:
* Joining Kubernetes Incubator
* Cooperation with [Helm](https://github.com/kubernetes/helm) project
* [Failure handling](https://github.com/Mirantis/k8s-AppController/blob/master/docs/research/failure-handling.md)
* Implementation of [AppController Mysql Multi Slave research](https://github.com/Mirantis/k8s-AppController/blob/master/docs/research/lcm.md)
* Real life examples
* [Flows](https://github.com/Mirantis/k8s-AppController/pull/212) implementation
* HA for AppController Pod
* Real life examples
* Documentation improvements
3 changes: 0 additions & 3 deletions ac-run.sh

This file was deleted.

3 changes: 0 additions & 3 deletions ac-stop.sh

This file was deleted.

7 changes: 0 additions & 7 deletions ac_service.sh

This file was deleted.

82 changes: 4 additions & 78 deletions cmd/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,10 @@
package cmd

import (
"fmt"
"log"
"os"
"strconv"
"strings"

"github.com/spf13/cobra"
"k8s.io/client-go/pkg/labels"

"github.com/Mirantis/k8s-AppController/pkg/client"
"github.com/Mirantis/k8s-AppController/pkg/scheduler"
Expand All @@ -31,18 +27,6 @@ import (
func deploy(cmd *cobra.Command, args []string) {
var err error

concurrency, err := cmd.Flags().GetInt("concurrency")
if err != nil {
log.Fatal(err)
}

labelSelector, err := getLabelSelector(cmd)
if err != nil {
log.Fatal(err)
}

log.Println("Using concurrency:", concurrency)

var url string
if len(args) > 0 {
url = args[0]
Expand All @@ -55,75 +39,17 @@ func deploy(cmd *cobra.Command, args []string) {
if err != nil {
log.Fatal(err)
}

sel, err := labels.Parse(labelSelector)
if err != nil {
log.Fatal(err)
}

log.Println("Using label selector:", labelSelector)

depGraph, err := scheduler.BuildDependencyGraph(c, sel)
if err != nil {
log.Fatal(err)
}

log.Println("Checking for circular dependencies.")
cycles := scheduler.DetectCycles(depGraph)
if len(cycles) > 0 {
message := "Cycles detected, terminating:\n"
for _, cycle := range cycles {
keys := make([]string, 0, len(cycle))
for _, vertex := range cycle {
keys = append(keys, vertex.Key())
}
message = fmt.Sprintf("%sCycle: %s\n", message, strings.Join(keys, ", "))
}

log.Fatal(message)
} else {
log.Println("No cycles detected.")
}
controller := scheduler.NewDeploymentController(c)
stopChan := make(chan struct{})
scheduler.Create(depGraph, concurrency, stopChan)

log.Println("Done")

}

func getLabelSelector(cmd *cobra.Command) (string, error) {
labelSelector, err := cmd.Flags().GetString("label")
if labelSelector == "" {
labelSelector = os.Getenv("KUBERNETES_AC_LABEL_SELECTOR")
}
return labelSelector, err
controller.Run(stopChan)
}

// InitRunCommand returns cobra command for performing AppController graph deployment
func InitRunCommand() (*cobra.Command, error) {
run := &cobra.Command{
return &cobra.Command{
Use: "run",
Short: "Start deployment of AppController graph",
Long: "Start deployment of AppController graph",
Run: deploy,
}

var labelSelector string
run.Flags().StringVarP(&labelSelector, "label", "l", "", "Label selector. Overrides KUBERNETES_AC_LABEL_SELECTOR env variable in AppController pod.")

concurrencyString := os.Getenv("KUBERNETES_AC_CONCURRENCY")

var err error
var concurrencyDefault int
if len(concurrencyString) > 0 {
concurrencyDefault, err = strconv.Atoi(concurrencyString)
if err != nil {
log.Printf("KUBERNETES_AC_CONCURRENCY is set to '%s' but it does not look like an integer: %v",
concurrencyString, err)
concurrencyDefault = 0
}
}
var concurrency int
run.Flags().IntVarP(&concurrency, "concurrency", "c", concurrencyDefault, "concurrency")
return run, err
}, nil
}
7 changes: 2 additions & 5 deletions cmd/deploy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,10 @@ func TestLabelFlag(t *testing.T) {
cmd, _ := InitRunCommand()

val := "TEST_KEY=TEST_VALUE"
val2 := "TEST_OTHER_KEY=TEST_OTHER_VALUE"
os.Setenv("KUBERNETES_AC_LABEL_SELECTOR", val)
cmd.Flags().Parse([]string{"-l", val2})

label, _ := getLabelSelector(cmd)

if label != val2 {
t.Errorf("label selector should be equal to `%s`, is `%s` instead", val2, label)
if label != val {
t.Errorf("label selector should be equal to `%s`, is `%s` instead", val, label)
}
}
8 changes: 8 additions & 0 deletions cmd/get-status.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,14 @@ import (
"k8s.io/client-go/pkg/labels"
)

func getLabelSelector(cmd *cobra.Command) (string, error) {
labelSelector, err := cmd.Flags().GetString("label")
if labelSelector == "" {
labelSelector = os.Getenv("KUBERNETES_AC_LABEL_SELECTOR")
}
return labelSelector, err
}

// GetStatus is a command that prints the deployment status
func getStatus(cmd *cobra.Command, args []string) {
var err error
Expand Down
17 changes: 17 additions & 0 deletions e2e/basic_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"k8s.io/client-go/pkg/api"
"k8s.io/client-go/pkg/api/errors"
"k8s.io/client-go/pkg/api/v1"
"k8s.io/client-go/pkg/runtime"
"k8s.io/client-go/pkg/util/intstr"
Expand Down Expand Up @@ -99,6 +100,22 @@ var _ = Describe("Basic Suite", func() {
testutils.WaitForPod(framework.Clientset, framework.Namespace.Name, pod2.Name, v1.PodRunning)
})

It("Deployment should finish even if appcontroller pod was terminated", func() {
framework.DeletePod()
By("Creating resource definition with single pod")
pod1 := PodPause("pod1")
framework.WrapAndCreate(pod1)
framework.Run()
By("Verify that pod is consistently not found")
Consistently(func() bool {
_, err := framework.Client.Pods().Get(pod1.Name)
return errors.IsNotFound(err)
}, 5*time.Second, 1*time.Second).Should(BeTrue(), "Pod was unexpectadly created")
By("Recreate appcontroller pod and verify that pod was successfully created")
framework.Prepare()
testutils.WaitForPod(framework.Clientset, framework.Namespace.Name, pod1.Name, v1.PodRunning)
})

Describe("Failure handling - subgraph", func() {
var parentPod *v1.Pod
var childPod *v1.Pod
Expand Down
Loading