diff --git a/controller/environmentApi.go b/controller/environmentApi.go index cd50b96a..3840d6cf 100644 --- a/controller/environmentApi.go +++ b/controller/environmentApi.go @@ -60,6 +60,12 @@ func (a *API) EnvironmentApiCreate(w http.ResponseWriter, r *http.Request) { return } + err = validateResourceName(env.Metadata.Name) + if err != nil { + a.respondWithError(w, err) + return + } + enew, err := a.fissionClient.Environments(env.Metadata.Namespace).Create(&env) if err != nil { a.respondWithError(w, err) diff --git a/controller/functionApi.go b/controller/functionApi.go index b6abc683..d1e28b63 100644 --- a/controller/functionApi.go +++ b/controller/functionApi.go @@ -61,6 +61,12 @@ func (a *API) FunctionApiCreate(w http.ResponseWriter, r *http.Request) { return } + err = validateResourceName(f.Metadata.Name) + if err != nil { + a.respondWithError(w, err) + return + } + // Ensure size limits if len(f.Spec.Source.Literal) > 256*1024 { err := fission.MakeError(fission.ErrorInvalidArgument, "Source package literal larger than 256K") diff --git a/controller/httpTriggerApi.go b/controller/httpTriggerApi.go index 7e9b0c72..827e4b99 100644 --- a/controller/httpTriggerApi.go +++ b/controller/httpTriggerApi.go @@ -74,6 +74,12 @@ func (a *API) HTTPTriggerApiCreate(w http.ResponseWriter, r *http.Request) { return } + err = validateResourceName(t.Metadata.Name) + if err != nil { + a.respondWithError(w, err) + return + } + // Ensure we don't have a duplicate HTTP route defined (same URL and method) err = a.checkHttpTriggerDuplicates(&t) if err != nil { diff --git a/controller/mqTriggerApi.go b/controller/mqTriggerApi.go index 7740dcad..2d9735b6 100644 --- a/controller/mqTriggerApi.go +++ b/controller/mqTriggerApi.go @@ -57,6 +57,12 @@ func (a *API) MessageQueueTriggerApiCreate(w http.ResponseWriter, r *http.Reques return } + err = validateResourceName(mqTrigger.Metadata.Name) + if err != nil { + a.respondWithError(w, err) + return + } + tnew, err := a.fissionClient.Messagequeuetriggers(mqTrigger.Metadata.Namespace).Create(&mqTrigger) if err != nil { a.respondWithError(w, err) diff --git a/controller/timeTriggerApi.go b/controller/timeTriggerApi.go index 689966e2..86ffa595 100644 --- a/controller/timeTriggerApi.go +++ b/controller/timeTriggerApi.go @@ -59,6 +59,12 @@ func (a *API) TimeTriggerApiCreate(w http.ResponseWriter, r *http.Request) { return } + err = validateResourceName(t.Metadata.Name) + if err != nil { + a.respondWithError(w, err) + return + } + // validate _, err = cron.Parse(t.Spec.Cron) if err != nil { diff --git a/controller/tpr.go b/controller/tpr.go index aaea49d3..f1533849 100644 --- a/controller/tpr.go +++ b/controller/tpr.go @@ -17,6 +17,9 @@ limitations under the License. package controller import ( + "errors" + "regexp" + "github.com/fission/fission/tpr" ) @@ -27,3 +30,11 @@ func makeTPRBackedAPI() (*API, error) { } return &API{fissionClient: fissionClient}, nil } + +func validateResourceName(name string) error { + re := regexp.MustCompile(`[a-z0-9]([-a-z0-9]*[a-z0-9])?`) + if len(re.FindString(name)) != len(name) { + return errors.New("Name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?'") + } + return nil +} diff --git a/controller/watchApi.go b/controller/watchApi.go index d141bf5c..8ef781bf 100644 --- a/controller/watchApi.go +++ b/controller/watchApi.go @@ -58,6 +58,12 @@ func (a *API) WatchApiCreate(w http.ResponseWriter, r *http.Request) { return } + err = validateResourceName(watch.Metadata.Name) + if err != nil { + a.respondWithError(w, err) + return + } + // TODO check for duplicate watches wnew, err := a.fissionClient.Kuberneteswatchtriggers(watch.Metadata.Namespace).Create(&watch)