Tested with `kind` and GKE. Note: "nodes" shown in `docker buildx ls` are unrelated to Kubernetes "nodes". Probably buildx should come up with an alternative term. Usage: $ kind create cluster $ export KUBECONFIG="$(kind get kubeconfig-path --name="kind")" $ docker buildx create --driver kubernetes --driver-opt replicas=3 --use $ docker buildx build -t foo --load . `--load` loads the image into the local Docker. Driver opts: - `image=IMAGE` - Sets the container image to be used for running buildkit. - `namespace=NS` - Sets the Kubernetes namespace. Defaults to the current namespace. - `replicas=N` - Sets the number of `Pod` replicas. Defaults to 1. - `rootless=(true|false)` - Run the container as a non-root user without `securityContext.privileged`. Defaults to false. - `loadbalance=(sticky|random)` - Load-balancing strategy. If set to "sticky", the pod is chosen using the hash of the context path. Defaults to "sticky" Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
108 lines
3.9 KiB
Go
108 lines
3.9 KiB
Go
package openstack
|
|
|
|
import (
|
|
"github.com/gophercloud/gophercloud"
|
|
tokens2 "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens"
|
|
tokens3 "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens"
|
|
)
|
|
|
|
/*
|
|
V2EndpointURL discovers the endpoint URL for a specific service from a
|
|
ServiceCatalog acquired during the v2 identity service.
|
|
|
|
The specified EndpointOpts are used to identify a unique, unambiguous endpoint
|
|
to return. It's an error both when multiple endpoints match the provided
|
|
criteria and when none do. The minimum that can be specified is a Type, but you
|
|
will also often need to specify a Name and/or a Region depending on what's
|
|
available on your OpenStack deployment.
|
|
*/
|
|
func V2EndpointURL(catalog *tokens2.ServiceCatalog, opts gophercloud.EndpointOpts) (string, error) {
|
|
// Extract Endpoints from the catalog entries that match the requested Type, Name if provided, and Region if provided.
|
|
var endpoints = make([]tokens2.Endpoint, 0, 1)
|
|
for _, entry := range catalog.Entries {
|
|
if (entry.Type == opts.Type) && (opts.Name == "" || entry.Name == opts.Name) {
|
|
for _, endpoint := range entry.Endpoints {
|
|
if opts.Region == "" || endpoint.Region == opts.Region {
|
|
endpoints = append(endpoints, endpoint)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Report an error if the options were ambiguous.
|
|
if len(endpoints) > 1 {
|
|
err := &ErrMultipleMatchingEndpointsV2{}
|
|
err.Endpoints = endpoints
|
|
return "", err
|
|
}
|
|
|
|
// Extract the appropriate URL from the matching Endpoint.
|
|
for _, endpoint := range endpoints {
|
|
switch opts.Availability {
|
|
case gophercloud.AvailabilityPublic:
|
|
return gophercloud.NormalizeURL(endpoint.PublicURL), nil
|
|
case gophercloud.AvailabilityInternal:
|
|
return gophercloud.NormalizeURL(endpoint.InternalURL), nil
|
|
case gophercloud.AvailabilityAdmin:
|
|
return gophercloud.NormalizeURL(endpoint.AdminURL), nil
|
|
default:
|
|
err := &ErrInvalidAvailabilityProvided{}
|
|
err.Argument = "Availability"
|
|
err.Value = opts.Availability
|
|
return "", err
|
|
}
|
|
}
|
|
|
|
// Report an error if there were no matching endpoints.
|
|
err := &gophercloud.ErrEndpointNotFound{}
|
|
return "", err
|
|
}
|
|
|
|
/*
|
|
V3EndpointURL discovers the endpoint URL for a specific service from a Catalog
|
|
acquired during the v3 identity service.
|
|
|
|
The specified EndpointOpts are used to identify a unique, unambiguous endpoint
|
|
to return. It's an error both when multiple endpoints match the provided
|
|
criteria and when none do. The minimum that can be specified is a Type, but you
|
|
will also often need to specify a Name and/or a Region depending on what's
|
|
available on your OpenStack deployment.
|
|
*/
|
|
func V3EndpointURL(catalog *tokens3.ServiceCatalog, opts gophercloud.EndpointOpts) (string, error) {
|
|
// Extract Endpoints from the catalog entries that match the requested Type, Interface,
|
|
// Name if provided, and Region if provided.
|
|
var endpoints = make([]tokens3.Endpoint, 0, 1)
|
|
for _, entry := range catalog.Entries {
|
|
if (entry.Type == opts.Type) && (opts.Name == "" || entry.Name == opts.Name) {
|
|
for _, endpoint := range entry.Endpoints {
|
|
if opts.Availability != gophercloud.AvailabilityAdmin &&
|
|
opts.Availability != gophercloud.AvailabilityPublic &&
|
|
opts.Availability != gophercloud.AvailabilityInternal {
|
|
err := &ErrInvalidAvailabilityProvided{}
|
|
err.Argument = "Availability"
|
|
err.Value = opts.Availability
|
|
return "", err
|
|
}
|
|
if (opts.Availability == gophercloud.Availability(endpoint.Interface)) &&
|
|
(opts.Region == "" || endpoint.Region == opts.Region || endpoint.RegionID == opts.Region) {
|
|
endpoints = append(endpoints, endpoint)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Report an error if the options were ambiguous.
|
|
if len(endpoints) > 1 {
|
|
return "", ErrMultipleMatchingEndpointsV3{Endpoints: endpoints}
|
|
}
|
|
|
|
// Extract the URL from the matching Endpoint.
|
|
for _, endpoint := range endpoints {
|
|
return gophercloud.NormalizeURL(endpoint.URL), nil
|
|
}
|
|
|
|
// Report an error if there were no matching endpoints.
|
|
err := &gophercloud.ErrEndpointNotFound{}
|
|
return "", err
|
|
}
|