* Add Virtual Kubelet provider for OpenStack Zun Initial virtual kubelet provider for OpenStack Zun. This provider currently handles creating, starting and deleting a pod via OpenStack Zun. Currently the configmap and secret is not support in Zun. Currently the Volume is supported in Zun and will implementation the support in virtual kubelet in next several patches. Will add document to elaborate this development status. Change-Id: Id80f18d89b22c535214aef95254f5c3c7ae23139 Signed-off-by: Kevin Zhao <kevin.zhao@arm.com> * trying to fix dependencies Change-Id: I8e6f2e0234a11591ff2be74e22dca1fb91bf8f47 Signed-off-by: Davanum Srinivas <davanum@gmail.com> * Add dummy ExecInContainer method Change-Id: Idece5695bd81b0911538660526484895cdd8832c Signed-off-by: Davanum Srinivas <davanum@gmail.com> * better use of fmt.Errorf Change-Id: Ic402c80bd2302ac4f26b0025f110cbf9977ca862 Signed-off-by: Davanum Srinivas <davanum@gmail.com> * fix gofmt error Signed-off-by: Kevin Zhao <kevinzs2048@gmail.com> * add gophercloud vendor Signed-off-by: Kevin Zhao <kevinzs2048@gmail.com> * add provider register for openstack Signed-off-by: Kevin Zhao <kevinzs2048@gmail.com> * fix build error Signed-off-by: Kevin Zhao <kevinzs2048@gmail.com> * excluded aci test case Signed-off-by: Kevin Zhao <kevinzs2048@gmail.com> * Zun: several fixes on openstack provider * Remove 'zunCapStatusToPodPhase' since it is not used anymore. * Remove the handling of first container in capsule. * Remove 'ApiVersion' from CapsuleTemplate Signed-off-by: Hongbin Lu <hongbin034@gmail.com> * Update gophercloud to latest * Zun: use Zun API micro version 1.32 Signed-off-by: Hongbin Lu <hongbin034@gmail.com> * Zun: wait for capsule to be deleted Resource deletion in OpenStack Zun is asynchronous which means the resource is not deleted immediately right after the delete request. This commit make the provider wait for resource deletion to complete on DeletePod. Signed-off-by: Hongbin Lu <hongbin034@gmail.com> * Change the build tag to openstack_provider Signed-off-by: Hongbin Lu <hongbin034@gmail.com>
103 lines
2.7 KiB
Go
103 lines
2.7 KiB
Go
package gophercloud
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// WaitFor polls a predicate function, once per second, up to a timeout limit.
|
|
// This is useful to wait for a resource to transition to a certain state.
|
|
// To handle situations when the predicate might hang indefinitely, the
|
|
// predicate will be prematurely cancelled after the timeout.
|
|
// Resource packages will wrap this in a more convenient function that's
|
|
// specific to a certain resource, but it can also be useful on its own.
|
|
func WaitFor(timeout int, predicate func() (bool, error)) error {
|
|
type WaitForResult struct {
|
|
Success bool
|
|
Error error
|
|
}
|
|
|
|
start := time.Now().Unix()
|
|
|
|
for {
|
|
// If a timeout is set, and that's been exceeded, shut it down.
|
|
if timeout >= 0 && time.Now().Unix()-start >= int64(timeout) {
|
|
return fmt.Errorf("A timeout occurred")
|
|
}
|
|
|
|
time.Sleep(1 * time.Second)
|
|
|
|
var result WaitForResult
|
|
ch := make(chan bool, 1)
|
|
go func() {
|
|
defer close(ch)
|
|
satisfied, err := predicate()
|
|
result.Success = satisfied
|
|
result.Error = err
|
|
}()
|
|
|
|
select {
|
|
case <-ch:
|
|
if result.Error != nil {
|
|
return result.Error
|
|
}
|
|
if result.Success {
|
|
return nil
|
|
}
|
|
// If the predicate has not finished by the timeout, cancel it.
|
|
case <-time.After(time.Duration(timeout) * time.Second):
|
|
return fmt.Errorf("A timeout occurred")
|
|
}
|
|
}
|
|
}
|
|
|
|
// NormalizeURL is an internal function to be used by provider clients.
|
|
//
|
|
// It ensures that each endpoint URL has a closing `/`, as expected by
|
|
// ServiceClient's methods.
|
|
func NormalizeURL(url string) string {
|
|
if !strings.HasSuffix(url, "/") {
|
|
return url + "/"
|
|
}
|
|
return url
|
|
}
|
|
|
|
// NormalizePathURL is used to convert rawPath to a fqdn, using basePath as
|
|
// a reference in the filesystem, if necessary. basePath is assumed to contain
|
|
// either '.' when first used, or the file:// type fqdn of the parent resource.
|
|
// e.g. myFavScript.yaml => file://opt/lib/myFavScript.yaml
|
|
func NormalizePathURL(basePath, rawPath string) (string, error) {
|
|
u, err := url.Parse(rawPath)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
// if a scheme is defined, it must be a fqdn already
|
|
if u.Scheme != "" {
|
|
return u.String(), nil
|
|
}
|
|
// if basePath is a url, then child resources are assumed to be relative to it
|
|
bu, err := url.Parse(basePath)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
var basePathSys, absPathSys string
|
|
if bu.Scheme != "" {
|
|
basePathSys = filepath.FromSlash(bu.Path)
|
|
absPathSys = filepath.Join(basePathSys, rawPath)
|
|
bu.Path = filepath.ToSlash(absPathSys)
|
|
return bu.String(), nil
|
|
}
|
|
|
|
absPathSys = filepath.Join(basePath, rawPath)
|
|
u.Path = filepath.ToSlash(absPathSys)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
u.Scheme = "file"
|
|
return u.String(), nil
|
|
|
|
}
|