| package kubernetes |
| |
| import ( |
| apiv1beta1 "github.com/docker/cli/kubernetes/compose/v1beta1" |
| apiv1beta2 "github.com/docker/cli/kubernetes/compose/v1beta2" |
| "github.com/pkg/errors" |
| apimachinerymetav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
| metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
| "k8s.io/apimachinery/pkg/runtime/schema" |
| "k8s.io/client-go/kubernetes" |
| ) |
| |
| // StackVersion represents the detected Compose Component on Kubernetes side. |
| type StackVersion string |
| |
| const ( |
| // StackAPIV1Beta1 is returned if it's the most recent version available. |
| StackAPIV1Beta1 = StackVersion("v1beta1") |
| // StackAPIV1Beta2 is returned if it's the most recent version available. |
| StackAPIV1Beta2 = StackVersion("v1beta2") |
| ) |
| |
| // GetStackAPIVersion returns the most recent stack API installed. |
| func GetStackAPIVersion(clientSet *kubernetes.Clientset) (StackVersion, error) { |
| groups, err := clientSet.Discovery().ServerGroups() |
| if err != nil { |
| return "", err |
| } |
| |
| return getAPIVersion(groups) |
| } |
| |
| func getAPIVersion(groups *metav1.APIGroupList) (StackVersion, error) { |
| switch { |
| case findVersion(apiv1beta2.SchemeGroupVersion, groups.Groups): |
| return StackAPIV1Beta2, nil |
| case findVersion(apiv1beta1.SchemeGroupVersion, groups.Groups): |
| return StackAPIV1Beta1, nil |
| default: |
| return "", errors.Errorf("failed to find a Stack API version") |
| } |
| } |
| |
| func findVersion(stackAPI schema.GroupVersion, groups []apimachinerymetav1.APIGroup) bool { |
| for _, group := range groups { |
| if group.Name == stackAPI.Group { |
| for _, version := range group.Versions { |
| if version.Version == stackAPI.Version { |
| return true |
| } |
| } |
| } |
| } |
| return false |
| } |