package validation
import (
"testing"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors"
"github.com/openshift/origin/pkg/deploy/api"
)
// Convenience methods
func manualTrigger() api.DeploymentTriggerPolicy {
return api.DeploymentTriggerPolicy{
Type: api.DeploymentTriggerManual,
}
}
func okTemplate() api.DeploymentTemplate {
return api.DeploymentTemplate{
Strategy: okStrategy(),
}
}
func okStrategy() api.DeploymentStrategy {
return api.DeploymentStrategy{
Type: "customPod",
CustomPod: okCustomPod(),
}
}
func okCustomPod() *api.CustomPodDeploymentStrategy {
return &api.CustomPodDeploymentStrategy{
Image: "openshift/kube-deploy",
}
}
// TODO: test validation errors for ReplicationControllerTemplates
func TestValidateDeploymentOK(t *testing.T) {
errs := ValidateDeployment(&api.Deployment{
Strategy: okStrategy(),
})
if len(errs) > 0 {
t.Errorf("Unxpected non-empty error list: %#v", errs)
}
}
func TestValidateDeploymentMissingFields(t *testing.T) {
errorCases := map[string]struct {
D api.Deployment
T errors.ValidationErrorType
F string
}{
"missing Strategy.Type": {
api.Deployment{
Strategy: api.DeploymentStrategy{
CustomPod: okCustomPod(),
},
},
errors.ValidationErrorTypeRequired,
"Strategy.Type",
},
"missing Strategy.CustomPod": {
api.Deployment{
Strategy: api.DeploymentStrategy{
Type: "customPod",
},
},
errors.ValidationErrorTypeRequired,
"Strategy.CustomPod",
},
"missing Strategy.CustomPod.Image": {
api.Deployment{
Strategy: api.DeploymentStrategy{
Type: "customPod",
CustomPod: &api.CustomPodDeploymentStrategy{},
},
},
errors.ValidationErrorTypeRequired,
"Strategy.CustomPod.Image",
},
}
for k, v := range errorCases {
errs := ValidateDeployment(&v.D)
if len(errs) == 0 {
t.Errorf("Expected failure for scenario %s", k)
}
for i := range errs {
if errs[i].(errors.ValidationError).Type != v.T {
t.Errorf("%s: expected errors to have type %s: %v", k, v.T, errs[i])
}
if errs[i].(errors.ValidationError).Field != v.F {
t.Errorf("%s: expected errors to have field %s: %v", k, v.F, errs[i])
}
}
}
}
func TestValidateDeploymentConfigOK(t *testing.T) {
errs := ValidateDeploymentConfig(&api.DeploymentConfig{
TriggerPolicy: manualTrigger(),
Template: okTemplate(),
})
if len(errs) > 0 {
t.Errorf("Unxpected non-empty error list: %#v", errs)
}
}
func TestValidateDeploymentConfigMissingFields(t *testing.T) {
errorCases := map[string]struct {
D api.DeploymentConfig
T errors.ValidationErrorType
F string
}{
"missing TriggerPolicy.Type": {
api.DeploymentConfig{Template: okTemplate()},
errors.ValidationErrorTypeRequired,
"TriggerPolicy.Type",
},
"missing Strategy.Type": {
api.DeploymentConfig{
TriggerPolicy: manualTrigger(),
Template: api.DeploymentTemplate{
Strategy: api.DeploymentStrategy{
CustomPod: okCustomPod(),
},
},
},
errors.ValidationErrorTypeRequired,
"Template.Strategy.Type",
},
"missing Strategy.CustomPod": {
api.DeploymentConfig{
TriggerPolicy: manualTrigger(),
Template: api.DeploymentTemplate{
Strategy: api.DeploymentStrategy{
Type: "customPod",
},
},
},
errors.ValidationErrorTypeRequired,
"Template.Strategy.CustomPod",
},
"missing Template.Strategy.CustomPod.Image": {
api.DeploymentConfig{
TriggerPolicy: manualTrigger(),
Template: api.DeploymentTemplate{
Strategy: api.DeploymentStrategy{
Type: "customPod",
CustomPod: &api.CustomPodDeploymentStrategy{},
},
},
},
errors.ValidationErrorTypeRequired,
"Template.Strategy.CustomPod.Image",
},
}
for k, v := range errorCases {
errs := ValidateDeploymentConfig(&v.D)
if len(errs) == 0 {
t.Errorf("Expected failure for scenario %s", k)
}
for i := range errs {
if errs[i].(errors.ValidationError).Type != v.T {
t.Errorf("%s: expected errors to have type %s: %v", k, v.T, errs[i])
}
if errs[i].(errors.ValidationError).Field != v.F {
t.Errorf("%s: expected errors to have field %s: %v", k, v.F, errs[i])
}
}
}
}