@@ -10,10 +10,11 @@ import (
1010 "strconv"
1111 "time"
1212 "strings"
13+ "fmt"
1314)
1415
1516type kubernetesProviderInterface interface {
16- Create (podName string , nodeParams nodeParams ) error
17+ Create (podName string , nodeParams nodeParams ) ( nodeAddress string , err error )
1718 // idempotent operation
1819 Destroy (podName string ) error
1920}
@@ -24,7 +25,7 @@ type kubDnsProvider struct {
2425 clientFactory jsonwire.ClientFactoryInterface
2526}
2627
27- func (p * kubDnsProvider ) Create (podName string , nodeParams nodeParams ) error {
28+ func (p * kubDnsProvider ) Create (podName string , nodeParams nodeParams ) ( nodeAddress string , err error ) {
2829 pod := & apiV1.Pod {}
2930 pod .ObjectMeta .Name = podName
3031 pod .ObjectMeta .Labels = map [string ]string {"name" : podName }
@@ -34,50 +35,64 @@ func (p *kubDnsProvider) Create(podName string, nodeParams nodeParams) error {
3435 container .Image = nodeParams .Image
3536 port , err := strconv .Atoi (nodeParams .Port )
3637 if err != nil {
37- return errors .New ("convert to int nodeParams.Port, " + err .Error ())
38+ return "" , errors .New ("convert to int nodeParams.Port, " + err .Error ())
3839 }
3940 container .Ports = []apiV1.ContainerPort {{ContainerPort : int32 (port )}}
4041 pod .Spec .Containers = append (pod .Spec .Containers , container )
4142 _ , err = p .clientset .CoreV1Client .Pods (p .namespace ).Create (pod )
4243 if err != nil {
43- return errors .New ("send command pod/create to k8s, " + err .Error ())
44+ return "" , errors .New ("send command pod/create to k8s, " + err .Error ())
4445 }
4546
46- service := & apiV1.Service {}
47- service .ObjectMeta .Name = podName
48- service .Spec .ClusterIP = "None"
49- service .Spec .Ports = []apiV1.ServicePort {{Port : int32 (port )}}
50- service .Spec .Selector = map [string ]string {"name" : podName }
51- _ , err = p .clientset .CoreV1Client .Services (p .namespace ).Create (service )
52- if err != nil {
53- return errors .New ("send command service/create to k8s, " + err .Error ())
47+ stopWaitIP := time .After (40 * time .Second )
48+ log .Debugf ("start waiting pod ip" )
49+ var createdPodIP string
50+ LoopWaitIP:
51+ for {
52+ select {
53+ case <- stopWaitIP :
54+ return "" , fmt .Errorf ("wait podIP stopped by timeout, %v" , podName )
55+ default :
56+ time .Sleep (time .Second )
57+ createdPod , err := p .clientset .CoreV1Client .Pods (p .namespace ).Get (podName )
58+ if err != nil {
59+ log .Debugf ("fail get created pod, %v, %v" ,podName , err )
60+ continue
61+ }
62+ if createdPod .Status .PodIP == "" {
63+ log .Debugf ("empty pod ip, %v" , podName )
64+ continue
65+ }
66+ createdPodIP = createdPod .Status .PodIP
67+ break LoopWaitIP
68+ }
5469 }
5570
5671 // todo: пока так ожидаем поднятие ноды, так как не понятно что конкретно означают статусы возвращаемые через апи
57- client := p .clientFactory .Create (net .JoinHostPort (podName , nodeParams .Port ))
72+ nodeAddress = net .JoinHostPort (createdPodIP , nodeParams .Port )
73+ client := p .clientFactory .Create (nodeAddress )
5874 stop := time .After (40 * time .Second )
59- log .Debugln ("start waiting" )
60- Loop :
75+ log .Debugln ("start waiting selenium " )
76+ LoopWaitSelenium :
6177 for {
6278 select {
6379 case <- stop :
64- return errors . New ("wait stopped by timeout" )
80+ return "" , fmt . Errorf ("wait selenium stopped by timeout, %v" , podName )
6581 default :
6682 time .Sleep (time .Second )
67- log .Debugln ("start request" )
6883 message , err := client .Health ()
6984 if err != nil {
7085 log .Debugf ("fail request, %v" , err )
7186 continue
7287 }
7388 log .Debugf ("done request, status: %v" , message .Status )
7489 if message .Status == 0 {
75- break Loop
90+ break LoopWaitSelenium
7691 }
7792 }
7893 }
7994
80- return nil
95+ return nodeAddress , nil
8196}
8297
8398//Destroy - destroy all pod data (idempotent operation)
@@ -90,12 +105,5 @@ func (p *kubDnsProvider) Destroy(podName string) error {
90105 err = errors .New ("send command pod/delete to k8s, " + err .Error ())
91106 return err
92107 }
93- err = p .clientset .CoreV1Client .Services (p .namespace ).Delete (podName , & apiV1.DeleteOptions {})
94- switch {
95- case err != nil && strings .Contains (err .Error (), "not found" ):
96- // service already deleted
97- case err != nil :
98- return errors .New ("send command service/delete to k8s, " + err .Error ())
99- }
100108 return nil
101109}
0 commit comments