Skip to content

Commit 87cc26a

Browse files
author
Matt Rogers
committed
Use discovery based version gating for policy commands
1 parent 50094ed commit 87cc26a

File tree

4 files changed

+31
-46
lines changed

4 files changed

+31
-46
lines changed

pkg/cmd/server/admin/overwrite_bootstrappolicy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func (o OverwriteBootstrapPolicyOptions) Complete(f *clientcmd.Factory) error {
105105
return err
106106
}
107107

108-
return clientcmd.Gate(oClient, "", "3.7.0")
108+
return clientcmd.LegacyPolicyResourceGate(oClient)
109109
}
110110

111111
func (o OverwriteBootstrapPolicyOptions) OverwriteBootstrapPolicy() error {

pkg/cmd/util/clientcmd/gating.go

Lines changed: 28 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,49 @@
11
package clientcmd
22

33
import (
4-
"encoding/json"
54
"fmt"
65

7-
"github.com/blang/semver"
8-
96
"github.com/openshift/origin/pkg/client"
10-
"github.com/openshift/origin/pkg/version"
117
)
128

13-
// Gate returns an error if the server is below minServerVersion or above/equal maxServerVersion.
14-
// To test only for min or only max version, set the other string to the empty value.
15-
func Gate(ocClient *client.Client, minServerVersion, maxServerVersion string) error {
16-
if len(minServerVersion) == 0 && len(maxServerVersion) == 0 {
17-
return fmt.Errorf("No version info passed to gate command")
9+
// Return err if the server does not support any of the legacy policy objects (< 3.7)
10+
func LegacyPolicyResourceGate(ocClient *client.Client) error {
11+
return ResourceGate(ocClient, "authorization.openshift.io/v1", []string{
12+
"clusterpolicies",
13+
"clusterpolicybindings",
14+
"policies",
15+
"policybindings",
16+
})
17+
}
18+
19+
// Do a discovery for server resources of the provided groupVersion, returning nil if any one of resourceNames is supported
20+
// by the server.
21+
func ResourceGate(ocClient *client.Client, groupVersion string, resourceNames []string) error {
22+
if len(resourceNames) == 0 {
23+
return fmt.Errorf("No resources provided for resource gate check")
1824
}
1925

20-
ocVersionBody, err := ocClient.Get().AbsPath("/version/openshift").Do().Raw()
26+
serverVersion, err := ocClient.Discovery().ServerVersion()
2127
if err != nil {
22-
return err
23-
}
24-
ocServerInfo := &version.Info{}
25-
if err := json.Unmarshal(ocVersionBody, ocServerInfo); err != nil {
26-
return err
28+
return fmt.Errorf("Could not discover server version")
2729
}
28-
ocVersion := ocServerInfo.String()
29-
// skip first chracter as Openshift returns a 'v' preceding the actual
30-
// version string which semver does not grok
31-
semVersion, err := semver.Parse(ocVersion[1:])
30+
31+
serverResources, err := ocClient.Discovery().ServerResourcesForGroupVersion(groupVersion)
3232
if err != nil {
33-
return fmt.Errorf("Failed to parse server version %s: %v", ocVersion, err)
33+
return err
3434
}
35-
// ignore pre-release version info
36-
semVersion.Pre = nil
3735

38-
if len(minServerVersion) > 0 {
39-
min, err := semver.Parse(minServerVersion)
40-
if err != nil {
41-
return fmt.Errorf("Failed to parse min gate version %s: %v", minServerVersion, err)
42-
}
43-
// ignore pre-release version info
44-
min.Pre = nil
45-
if semVersion.LT(min) {
46-
return fmt.Errorf("This command works only with server versions > %s, found %s", minServerVersion, ocVersion)
47-
}
36+
if len(serverResources.APIResources) == 0 {
37+
return fmt.Errorf("Could not discover server resources")
4838
}
4939

50-
if len(maxServerVersion) > 0 {
51-
max, err := semver.Parse(maxServerVersion)
52-
if err != nil {
53-
return fmt.Errorf("Failed to parse max gate version %s: %v", maxServerVersion, err)
54-
}
55-
// ignore pre-release version info
56-
max.Pre = nil
57-
if semVersion.GTE(max) {
58-
return fmt.Errorf("This command works only with server versions < %s, found %s", maxServerVersion, ocVersion)
40+
for _, resource := range serverResources.APIResources {
41+
for i := range resourceNames {
42+
if resourceNames[i] == resource.Name {
43+
return nil
44+
}
5945
}
6046
}
6147

62-
// OK this is within min/max all good!
63-
return nil
48+
return fmt.Errorf("This command is not supported by server version %s", serverVersion.String())
6449
}

pkg/oc/admin/migrate/authorization/authorization.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func (o *MigrateAuthorizationOptions) Complete(name string, f *clientcmd.Factory
8989
return err
9090
}
9191

92-
if err := clientcmd.Gate(client, "", "3.7.0"); err != nil {
92+
if err := clientcmd.LegacyPolicyResourceGate(client); err != nil {
9393
return err
9494
}
9595

pkg/oc/cli/cmd/create/policy_binding.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (o *CreatePolicyBindingOptions) Complete(cmd *cobra.Command, f *clientcmd.F
7676
return err
7777
}
7878

79-
if err := clientcmd.Gate(client, "", "3.7.0"); err != nil {
79+
if err := clientcmd.LegacyPolicyResourceGate(client); err != nil {
8080
return err
8181
}
8282

0 commit comments

Comments
 (0)