Skip to content

Commit

Permalink
Merge 4b031dd into 09a6b0b
Browse files Browse the repository at this point in the history
  • Loading branch information
rmohr committed Mar 10, 2017
2 parents 09a6b0b + 4b031dd commit 3a15928
Show file tree
Hide file tree
Showing 22 changed files with 517 additions and 216 deletions.
4 changes: 3 additions & 1 deletion automation/check-merged.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ eval "$(curl -sL https://raw.githubusercontent.com/travis-ci/gimme/master/gimme
export GOPATH=$PWD/go
export GOBIN=$PWD/go/bin
export PATH=$GOPATH/bin:$PATH
export VAGRANT_NUM_NODES=1

# Needed for templating of manifests
pip install j2cli
Expand Down Expand Up @@ -45,6 +46,7 @@ make
# make test

# Delete traces from old deployments
sleep 10
cluster/kubectl.sh --init
cluster/kubectl.sh --core delete deployments --all
cluster/kubectl.sh --core delete pods --all
Expand All @@ -53,7 +55,7 @@ cluster/kubectl.sh --core delete pods --all
cluster/sync.sh

# Wait until virt-api is ready
sleep 30
sleep 60
cluster/kubectl.sh --core get pods
cluster/kubectl.sh version

Expand Down
2 changes: 0 additions & 2 deletions cluster/migration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,3 @@ metadata:
name: testvm-migration
spec:
migratingVMName: testvm
destinationNodeSelector:
kubernetes.io/hostname: master
2 changes: 1 addition & 1 deletion cluster/vagrant/setup_kubernetes_common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install -y docker kubelet kubeadm kubectl kubernetes-cni
yum install -y --nogpgcheck docker kubelet kubeadm kubectl kubernetes-cni

# To get the qemu user and libvirt
yum install -y qemu-common qemu-kvm qemu-system-x86 libcgroup-tools libvirt || :
Expand Down
1 change: 1 addition & 0 deletions cluster/vm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ spec:
driver:
name: qemu
type: raw
cache: none
source:
host:
name: iscsi-demo-target
Expand Down
2 changes: 1 addition & 1 deletion cmd/virt-controller/virt-controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ func main() {
vmController.WaitForSync(stop)

// Start watching pods
_, podController := watch.NewPodController(vmCache, nil, clientSet, restClient)
_, podController := watch.NewPodController(vmCache, nil, clientSet, restClient, vmService)
podController.StartInformer(stop)
go podController.Run(1, stop)

Expand Down
2 changes: 2 additions & 0 deletions manifests/haproxy.yaml.in
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,5 @@ spec:
- containerPort: 8184
name: "haproxy"
protocol: "TCP"
nodeSelector:
kubernetes.io/hostname: master
2 changes: 2 additions & 0 deletions manifests/iscsi-demo-target.yaml.in
Original file line number Diff line number Diff line change
Expand Up @@ -119,3 +119,5 @@ spec:
image: {{ docker_prefix }}/iscsi-demo-target-tgtd:{{ docker_tag }}
ports:
- containerPort: 3260
nodeSelector:
kubernetes.io/hostname: master
2 changes: 2 additions & 0 deletions manifests/squid.yaml.in
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,5 @@ spec:
- containerPort: 3128
name: "spice-proxy"
protocol: "TCP"
nodeSelector:
kubernetes.io/hostname: master
2 changes: 2 additions & 0 deletions manifests/virt-api.yaml.in
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,5 @@ spec:
- containerPort: 8183
name: "virt-api"
protocol: "TCP"
nodeSelector:
kubernetes.io/hostname: master
2 changes: 2 additions & 0 deletions manifests/virt-controller.yaml.in
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,5 @@ spec:
- containerPort: 8182
name: "virt-controller"
protocol: "TCP"
nodeSelector:
kubernetes.io/hostname: master
37 changes: 18 additions & 19 deletions pkg/api/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ package v1
import (
"encoding/json"
"fmt"
"reflect"

"github.com/jeevatkm/go-model"
"github.com/satori/go.uuid"
kubeapi "k8s.io/client-go/pkg/api"
Expand All @@ -22,7 +24,6 @@ import (
"kubevirt.io/kubevirt/pkg/api"
"kubevirt.io/kubevirt/pkg/mapper"
"kubevirt.io/kubevirt/pkg/precond"
"reflect"
)

// GroupName is the group name use in this package
Expand Down Expand Up @@ -416,40 +417,38 @@ func (ml *MigrationList) UnmarshalJSON(data []byte) error {

// Given a VM, create a NodeSelectorTerm with anti-affinity for that VM's node.
// This is useful for the case when a migration away from a node must occur.
func AntiAffinityFromVMNode(vm *VM) *v1.NodeSelectorTerm {
func AntiAffinityFromVMNode(vm *VM) *v1.Affinity {
return antiAffinityFromNode(vm.Status.NodeName)
}

func antiAffinityFromNode(nodeName string) *v1.NodeSelectorTerm {
func antiAffinityFromNode(nodeName string) *v1.Affinity {
selector := v1.NodeSelectorTerm{
MatchExpressions: []v1.NodeSelectorRequirement{
v1.NodeSelectorRequirement{
{
Key: "kubernetes.io/hostname",
Operator: v1.NodeSelectorOpNotIn,
Values: []string{nodeName},
},
},
}
return &selector
return &v1.Affinity{
NodeAffinity: &v1.NodeAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{NodeSelectorTerms: []v1.NodeSelectorTerm{selector}},
},
}
}

// Given a pod and an affinity rule, add the affinity to any others
// associated with the pod (if any). In this context, pod is the destination
// of a migration.
func ApplyAntiAffinityToPod(pod *v1.Pod, selector *v1.NodeSelectorTerm) (*v1.Pod, error) {
if pod.Spec.Affinity == nil {
newAffinity := v1.Affinity{}
pod.Spec.Affinity = &newAffinity
}
if pod.Spec.Affinity.NodeAffinity == nil {
newNodeAffinity := v1.NodeAffinity{}
pod.Spec.Affinity.NodeAffinity = &newNodeAffinity
}
if pod.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution == nil {
newNodeSelector := v1.NodeSelector{}
pod.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution = &newNodeSelector
func SetAntiAffinityToPod(pod *v1.Pod, affinity *v1.Affinity) (*v1.Pod, error) {

newAffinity, err := json.Marshal(affinity)
if err != nil {
return nil, err
}
nodeSelector := pod.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution
nodeSelector.NodeSelectorTerms = append(nodeSelector.NodeSelectorTerms, *selector)
pod.Annotations = map[string]string{}
pod.Annotations["scheduler.alpha.kubernetes.io/affinity"] = string(newAffinity)

return pod, nil
}
64 changes: 22 additions & 42 deletions pkg/api/v1/types_test.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package v1

import (
"encoding/json"
"testing"

. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"

"k8s.io/client-go/pkg/api/v1"
"testing"
)

var _ = Describe("PodSelectors", func() {
Context("Pod affinity rules", func() {
var (
pod = &v1.Pod{}
selector = &v1.NodeSelectorTerm{}
podWithSelector = &v1.Pod{}
pod = &v1.Pod{}
affinity = &v1.Affinity{}
)

BeforeEach(func() {
Expand All @@ -22,30 +22,16 @@ var _ = Describe("PodSelectors", func() {
NodeName: "testnode",
},
}
selector = &v1.NodeSelectorTerm{
MatchExpressions: []v1.NodeSelectorRequirement{
v1.NodeSelectorRequirement{
Key: "kubernetes.io/hostname",
Operator: v1.NodeSelectorOpNotIn,
Values: []string{pod.Spec.NodeName},
},
},
}
podWithSelector = &v1.Pod{
Spec: v1.PodSpec{
NodeName: "testnode",
Affinity: &v1.Affinity{
NodeAffinity: &v1.NodeAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{
NodeSelectorTerms: []v1.NodeSelectorTerm{
v1.NodeSelectorTerm{
MatchExpressions: []v1.NodeSelectorRequirement{
v1.NodeSelectorRequirement{
Key: "kubernetes.io/hostname",
Operator: v1.NodeSelectorOpIn,
Values: []string{"test2"},
},
},
affinity = &v1.Affinity{
NodeAffinity: &v1.NodeAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{
NodeSelectorTerms: []v1.NodeSelectorTerm{
{
MatchExpressions: []v1.NodeSelectorRequirement{
{
Key: "kubernetes.io/hostname",
Operator: v1.NodeSelectorOpNotIn,
Values: []string{pod.Spec.NodeName},
},
},
},
Expand All @@ -61,26 +47,20 @@ var _ = Describe("PodSelectors", func() {
It("should work", func() {
vm := NewMinimalVM("testvm")
vm.Status.NodeName = "test-node"
newSelector := AntiAffinityFromVMNode(vm)
affinity := AntiAffinityFromVMNode(vm)
newSelector := affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0]
Expect(newSelector).ToNot(BeNil())
Expect(len(newSelector.MatchExpressions)).To(Equal(1))
Expect(len(newSelector.MatchExpressions[0].Values)).To(Equal(1))
Expect(newSelector.MatchExpressions[0].Values[0]).To(Equal("test-node"))

})
It("Should create missing structs", func() {
newPod, err := ApplyAntiAffinityToPod(pod, selector)
Expect(err).ToNot(HaveOccurred())
Expect(newPod.Spec.Affinity).ToNot(BeNil())
Expect(newPod.Spec.Affinity.NodeAffinity).ToNot(BeNil())
Expect(newPod.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution).ToNot(BeNil())
terms := newPod.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms
Expect(len(terms)).To(Equal(1))
})
It("Should append to existing node selectors", func() {
newPod, err := ApplyAntiAffinityToPod(podWithSelector, selector)
newPod, err := SetAntiAffinityToPod(pod, affinity)
Expect(err).ToNot(HaveOccurred())
terms := newPod.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms
Expect(len(terms)).To(Equal(2))
generatedAffinity := v1.Affinity{}
Expect(json.Unmarshal([]byte(newPod.Annotations["scheduler.alpha.kubernetes.io/affinity"]), &generatedAffinity)).To(Succeed())
Expect(&generatedAffinity).To(Equal(affinity))
})
})
})
Expand Down
7 changes: 5 additions & 2 deletions pkg/kubecli/kubecli.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ func init() {
flag.StringVar(&master, "master", "", "master url")
}

func Get() (*kubernetes.Clientset, error) {

func GetFromFlages(master string, kubeconfig string) (*kubernetes.Clientset, error) {
config, err := clientcmd.BuildConfigFromFlags(master, kubeconfig)
if err != nil {
return nil, err
Expand All @@ -46,6 +45,10 @@ func Get() (*kubernetes.Clientset, error) {
return kubernetes.NewForConfig(config)
}

func Get() (*kubernetes.Clientset, error) {
return GetFromFlages(master, kubeconfig)
}

func GetRESTClient() (*rest.RESTClient, error) {
return GetRESTClientFromFlags(master, kubeconfig)
}
Expand Down
Loading

0 comments on commit 3a15928

Please sign in to comment.