| ... | ... |
@@ -97,14 +97,16 @@ func TestExampleObjectSchemas(t *testing.T) {
|
| 97 | 97 |
"ldapserver-service": &kapi.Service{},
|
| 98 | 98 |
}, |
| 99 | 99 |
"../test/integration/fixtures": {
|
| 100 |
- "test-deployment-config": &deployapi.DeploymentConfig{},
|
|
| 101 |
- "test-image": &imageapi.Image{},
|
|
| 102 |
- "test-image-stream": &imageapi.ImageStream{},
|
|
| 103 |
- "test-image-stream-mapping": nil, // skip &imageapi.ImageStreamMapping{},
|
|
| 104 |
- "test-route": &routeapi.Route{},
|
|
| 105 |
- "test-service": &kapi.Service{},
|
|
| 106 |
- "test-buildcli": &kapi.List{},
|
|
| 107 |
- "test-buildcli-beta2": &kapi.List{},
|
|
| 100 |
+ // TODO fix this test to handle json and yaml |
|
| 101 |
+ "project-request-template-with-quota": nil, // skip a yaml file |
|
| 102 |
+ "test-deployment-config": &deployapi.DeploymentConfig{},
|
|
| 103 |
+ "test-image": &imageapi.Image{},
|
|
| 104 |
+ "test-image-stream": &imageapi.ImageStream{},
|
|
| 105 |
+ "test-image-stream-mapping": nil, // skip &imageapi.ImageStreamMapping{},
|
|
| 106 |
+ "test-route": &routeapi.Route{},
|
|
| 107 |
+ "test-service": &kapi.Service{},
|
|
| 108 |
+ "test-buildcli": &kapi.List{},
|
|
| 109 |
+ "test-buildcli-beta2": &kapi.List{},
|
|
| 108 | 110 |
}, |
| 109 | 111 |
"../test/templates/fixtures": {
|
| 110 | 112 |
"crunchydata-pod": nil, // Explicitly fails validation, but should pass transformation |
| ... | ... |
@@ -252,11 +252,7 @@ func (o *EditOptions) RunEdit() error {
|
| 252 | 252 |
if err != nil {
|
| 253 | 253 |
return err |
| 254 | 254 |
} |
| 255 |
- data, err := info.Mapping.Codec.Encode(info.Object) |
|
| 256 |
- if err != nil {
|
|
| 257 |
- return err |
|
| 258 |
- } |
|
| 259 |
- updated, err := resource.NewHelper(info.Client, info.Mapping).Replace(info.Namespace, info.Name, false, data) |
|
| 255 |
+ updated, err := resource.NewHelper(info.Client, info.Mapping).Replace(info.Namespace, info.Name, false, info.Object) |
|
| 260 | 256 |
if err != nil {
|
| 261 | 257 |
fmt.Fprintln(o.out, results.AddError(err, info)) |
| 262 | 258 |
return nil |
| ... | ... |
@@ -415,7 +411,11 @@ func applyPatch(delta *jsonmerge.Delta, info *resource.Info, version string) err |
| 415 | 415 |
if err != nil {
|
| 416 | 416 |
return patchError{err}
|
| 417 | 417 |
} |
| 418 |
- updated, err := resource.NewHelper(info.Client, info.Mapping).Replace(info.Namespace, info.Name, false, merged) |
|
| 418 |
+ mergedObj, err := info.Mapping.Codec.Decode(merged) |
|
| 419 |
+ if err != nil {
|
|
| 420 |
+ return patchError{err}
|
|
| 421 |
+ } |
|
| 422 |
+ updated, err := resource.NewHelper(info.Client, info.Mapping).Replace(info.Namespace, info.Name, false, mergedObj) |
|
| 419 | 423 |
if err != nil {
|
| 420 | 424 |
return err |
| 421 | 425 |
} |
| ... | ... |
@@ -290,13 +290,7 @@ func RunEnv(f *clientcmd.Factory, in io.Reader, out io.Writer, cmd *cobra.Comman |
| 290 | 290 |
|
| 291 | 291 |
failed := false |
| 292 | 292 |
for _, info := range infos {
|
| 293 |
- data, err := info.Mapping.Codec.Encode(info.Object) |
|
| 294 |
- if err != nil {
|
|
| 295 |
- fmt.Fprintf(cmd.Out(), "Error: %v\n", err) |
|
| 296 |
- failed = true |
|
| 297 |
- continue |
|
| 298 |
- } |
|
| 299 |
- obj, err := resource.NewHelper(info.Client, info.Mapping).Replace(info.Namespace, info.Name, true, data) |
|
| 293 |
+ obj, err := resource.NewHelper(info.Client, info.Mapping).Replace(info.Namespace, info.Name, true, info.Object) |
|
| 300 | 294 |
if err != nil {
|
| 301 | 295 |
handlePodUpdateError(cmd.Out(), err, "environment variables") |
| 302 | 296 |
failed = true |
| ... | ... |
@@ -439,17 +439,11 @@ func (v *VolumeOptions) RunVolume(args []string) error {
|
| 439 | 439 |
|
| 440 | 440 |
failed := false |
| 441 | 441 |
for _, info := range updateInfos {
|
| 442 |
- data, err := info.Mapping.Codec.Encode(info.Object) |
|
| 443 |
- if err != nil {
|
|
| 444 |
- fmt.Fprintf(v.Err, "error: %v\n", err) |
|
| 445 |
- failed = true |
|
| 446 |
- continue |
|
| 447 |
- } |
|
| 448 | 442 |
var obj runtime.Object |
| 449 | 443 |
if len(info.ResourceVersion) == 0 {
|
| 450 |
- obj, err = resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, false, data) |
|
| 444 |
+ obj, err = resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, false, info.Object) |
|
| 451 | 445 |
} else {
|
| 452 |
- obj, err = resource.NewHelper(info.Client, info.Mapping).Replace(info.Namespace, info.Name, true, data) |
|
| 446 |
+ obj, err = resource.NewHelper(info.Client, info.Mapping).Replace(info.Namespace, info.Name, true, info.Object) |
|
| 453 | 447 |
} |
| 454 | 448 |
if err != nil {
|
| 455 | 449 |
handlePodUpdateError(v.Err, err, "volume") |
| ... | ... |
@@ -31,11 +31,7 @@ func NewPrintNameOrErrorAfter(mapper meta.RESTMapper, short bool, operation stri |
| 31 | 31 |
} |
| 32 | 32 |
|
| 33 | 33 |
func encodeAndCreate(info *resource.Info, namespace string, obj runtime.Object) (runtime.Object, error) {
|
| 34 |
- data, err := info.Mapping.Codec.Encode(obj) |
|
| 35 |
- if err != nil {
|
|
| 36 |
- return nil, err |
|
| 37 |
- } |
|
| 38 |
- return resource.NewHelper(info.Client, info.Mapping).Create(namespace, false, data) |
|
| 34 |
+ return resource.NewHelper(info.Client, info.Mapping).Create(namespace, false, obj) |
|
| 39 | 35 |
} |
| 40 | 36 |
|
| 41 | 37 |
// Create attempts to create each item generically, gathering all errors in the |
| 42 | 38 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,115 @@ |
| 0 |
+apiVersion: v1 |
|
| 1 |
+kind: Template |
|
| 2 |
+metadata: |
|
| 3 |
+ creationTimestamp: 2015-10-24T18:25:22Z |
|
| 4 |
+ name: default-project-request |
|
| 5 |
+ namespace: default |
|
| 6 |
+objects: |
|
| 7 |
+- apiVersion: v1 |
|
| 8 |
+ kind: Project |
|
| 9 |
+ metadata: |
|
| 10 |
+ annotations: |
|
| 11 |
+ openshift.io/description: ${PROJECT_DESCRIPTION}
|
|
| 12 |
+ openshift.io/display-name: ${PROJECT_DISPLAYNAME}
|
|
| 13 |
+ extra: here |
|
| 14 |
+ creationTimestamp: null |
|
| 15 |
+ name: ${PROJECT_NAME}
|
|
| 16 |
+ spec: {}
|
|
| 17 |
+ status: {}
|
|
| 18 |
+- apiVersion: v1 |
|
| 19 |
+ kind: ResourceQuota |
|
| 20 |
+ metadata: |
|
| 21 |
+ name: ${PROJECT_NAME}-quota
|
|
| 22 |
+ spec: |
|
| 23 |
+ hard: |
|
| 24 |
+ cpu: 200m |
|
| 25 |
+ memory: 512Mi |
|
| 26 |
+ pods: 3 |
|
| 27 |
+ replicationcontrollers: 3 |
|
| 28 |
+ resourcequotas: 1 |
|
| 29 |
+ services: 3 |
|
| 30 |
+- apiVersion: v1 |
|
| 31 |
+ kind: LimitRange |
|
| 32 |
+ metadata: |
|
| 33 |
+ creationTimestamp: null |
|
| 34 |
+ name: ${PROJECT_NAME}-limits
|
|
| 35 |
+ spec: |
|
| 36 |
+ limits: |
|
| 37 |
+ - max: |
|
| 38 |
+ cpu: 500m |
|
| 39 |
+ memory: 750Mi |
|
| 40 |
+ min: |
|
| 41 |
+ cpu: 10m |
|
| 42 |
+ memory: 5Mi |
|
| 43 |
+ type: Pod |
|
| 44 |
+ - default: |
|
| 45 |
+ cpu: 100m |
|
| 46 |
+ memory: 100Mi |
|
| 47 |
+ max: |
|
| 48 |
+ cpu: 500m |
|
| 49 |
+ memory: 750Mi |
|
| 50 |
+ min: |
|
| 51 |
+ cpu: 10m |
|
| 52 |
+ memory: 5Mi |
|
| 53 |
+ type: Container |
|
| 54 |
+- apiVersion: v1 |
|
| 55 |
+ groupNames: [] |
|
| 56 |
+ kind: RoleBinding |
|
| 57 |
+ metadata: |
|
| 58 |
+ creationTimestamp: null |
|
| 59 |
+ name: admins |
|
| 60 |
+ namespace: ${PROJECT_NAME}
|
|
| 61 |
+ roleRef: |
|
| 62 |
+ name: admin |
|
| 63 |
+ subjects: |
|
| 64 |
+ - kind: User |
|
| 65 |
+ name: ${PROJECT_ADMIN_USER}
|
|
| 66 |
+ userNames: |
|
| 67 |
+ - ${PROJECT_ADMIN_USER}
|
|
| 68 |
+- apiVersion: v1 |
|
| 69 |
+ groupNames: |
|
| 70 |
+ - system:serviceaccounts:${PROJECT_NAME}
|
|
| 71 |
+ kind: RoleBinding |
|
| 72 |
+ metadata: |
|
| 73 |
+ creationTimestamp: null |
|
| 74 |
+ name: system:image-pullers |
|
| 75 |
+ namespace: ${PROJECT_NAME}
|
|
| 76 |
+ roleRef: |
|
| 77 |
+ name: system:image-puller |
|
| 78 |
+ subjects: |
|
| 79 |
+ - kind: SystemGroup |
|
| 80 |
+ name: system:serviceaccounts:${PROJECT_NAME}
|
|
| 81 |
+ userNames: [] |
|
| 82 |
+- apiVersion: v1 |
|
| 83 |
+ groupNames: [] |
|
| 84 |
+ kind: RoleBinding |
|
| 85 |
+ metadata: |
|
| 86 |
+ creationTimestamp: null |
|
| 87 |
+ name: system:image-builders |
|
| 88 |
+ namespace: ${PROJECT_NAME}
|
|
| 89 |
+ roleRef: |
|
| 90 |
+ name: system:image-builder |
|
| 91 |
+ subjects: |
|
| 92 |
+ - kind: ServiceAccount |
|
| 93 |
+ name: builder |
|
| 94 |
+ userNames: |
|
| 95 |
+ - system:serviceaccount:${PROJECT_NAME}:builder
|
|
| 96 |
+- apiVersion: v1 |
|
| 97 |
+ groupNames: [] |
|
| 98 |
+ kind: RoleBinding |
|
| 99 |
+ metadata: |
|
| 100 |
+ creationTimestamp: null |
|
| 101 |
+ name: system:deployers |
|
| 102 |
+ namespace: ${PROJECT_NAME}
|
|
| 103 |
+ roleRef: |
|
| 104 |
+ name: system:deployer |
|
| 105 |
+ subjects: |
|
| 106 |
+ - kind: ServiceAccount |
|
| 107 |
+ name: deployer |
|
| 108 |
+ userNames: |
|
| 109 |
+ - system:serviceaccount:${PROJECT_NAME}:deployer
|
|
| 110 |
+parameters: |
|
| 111 |
+- name: PROJECT_NAME |
|
| 112 |
+- name: PROJECT_DISPLAYNAME |
|
| 113 |
+- name: PROJECT_DESCRIPTION |
|
| 114 |
+- name: PROJECT_ADMIN_USER |
|
| 0 | 115 |
\ No newline at end of file |
| ... | ... |
@@ -19,7 +19,6 @@ import ( |
| 19 | 19 |
"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy" |
| 20 | 20 |
"github.com/openshift/origin/pkg/cmd/util/tokencmd" |
| 21 | 21 |
projectapi "github.com/openshift/origin/pkg/project/api" |
| 22 |
- projectrequeststorage "github.com/openshift/origin/pkg/project/registry/projectrequest/delegated" |
|
| 23 | 22 |
testutil "github.com/openshift/origin/test/util" |
| 24 | 23 |
testserver "github.com/openshift/origin/test/util/server" |
| 25 | 24 |
) |
| ... | ... |
@@ -132,11 +131,13 @@ func TestUnprivilegedNewProjectFromTemplate(t *testing.T) {
|
| 132 | 132 |
t.Fatalf("unexpected error: %v", err)
|
| 133 | 133 |
} |
| 134 | 134 |
|
| 135 |
- template := projectrequeststorage.DefaultTemplate() |
|
| 135 |
+ template, err := testutil.GetTemplateFixture("fixtures/project-request-template-with-quota.yaml")
|
|
| 136 |
+ if err != nil {
|
|
| 137 |
+ t.Fatalf("unexpected error: %v", err)
|
|
| 138 |
+ } |
|
| 136 | 139 |
template.Name = templateName |
| 137 | 140 |
template.Namespace = namespace |
| 138 | 141 |
|
| 139 |
- template.Objects[0].(*projectapi.Project).Annotations["extra"] = "here" |
|
| 140 | 142 |
_, err = clusterAdminClient.Templates(namespace).Create(template) |
| 141 | 143 |
if err != nil {
|
| 142 | 144 |
t.Fatalf("unexpected error: %v", err)
|
| ... | ... |
@@ -4,10 +4,13 @@ import ( |
| 4 | 4 |
"fmt" |
| 5 | 5 |
"io/ioutil" |
| 6 | 6 |
|
| 7 |
- buildapi "github.com/openshift/origin/pkg/build/api" |
|
| 8 |
- imageapi "github.com/openshift/origin/pkg/image/api" |
|
| 9 | 7 |
kapi "k8s.io/kubernetes/pkg/api" |
| 10 | 8 |
"k8s.io/kubernetes/pkg/api/latest" |
| 9 |
+ kyaml "k8s.io/kubernetes/pkg/util/yaml" |
|
| 10 |
+ |
|
| 11 |
+ buildapi "github.com/openshift/origin/pkg/build/api" |
|
| 12 |
+ imageapi "github.com/openshift/origin/pkg/image/api" |
|
| 13 |
+ templateapi "github.com/openshift/origin/pkg/template/api" |
|
| 11 | 14 |
) |
| 12 | 15 |
|
| 13 | 16 |
// CreateSampleImageStream creates an ImageStream in given namespace |
| ... | ... |
@@ -58,3 +61,19 @@ func GetSecretFixture(filename string) *kapi.Secret {
|
| 58 | 58 |
latest.CodecForLegacyGroup().DecodeInto(jsonData, &secret) |
| 59 | 59 |
return &secret |
| 60 | 60 |
} |
| 61 |
+ |
|
| 62 |
+func GetTemplateFixture(filename string) (*templateapi.Template, error) {
|
|
| 63 |
+ data, err := ioutil.ReadFile(filename) |
|
| 64 |
+ if err != nil {
|
|
| 65 |
+ return nil, err |
|
| 66 |
+ } |
|
| 67 |
+ jsonData, err := kyaml.ToJSON(data) |
|
| 68 |
+ if err != nil {
|
|
| 69 |
+ return nil, err |
|
| 70 |
+ } |
|
| 71 |
+ obj, err := latest.CodecForLegacyGroup().Decode(jsonData) |
|
| 72 |
+ if err != nil {
|
|
| 73 |
+ return nil, err |
|
| 74 |
+ } |
|
| 75 |
+ return obj.(*templateapi.Template), nil |
|
| 76 |
+} |