Skip to content

Add support for TrafficSplitter in GCP #1892

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions pkg/operator/resources/resources.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ func UpdateAPI(apiConfig *userconfig.API, projectID string, force bool) (*schema
case userconfig.TaskAPIKind:
api, msg, err = taskapi.UpdateAPI(apiConfig, projectID)
case userconfig.TrafficSplitterKind:
api, msg, err = trafficsplitter.UpdateAPI(apiConfig, force)
api, msg, err = trafficsplitter.UpdateAPI(apiConfig)
default:
return nil, "", ErrorOperationIsOnlySupportedForKind(
*deployedResource, userconfig.RealtimeAPIKind,
Expand Down Expand Up @@ -275,7 +275,7 @@ func patchAPI(apiConfig *userconfig.API, force bool) (*spec.API, string, error)
case userconfig.TaskAPIKind:
return taskapi.UpdateAPI(apiConfig, prevAPISpec.ProjectID)
default:
return trafficsplitter.UpdateAPI(apiConfig, force)
return trafficsplitter.UpdateAPI(apiConfig)
}
}

Expand Down
28 changes: 17 additions & 11 deletions pkg/operator/resources/trafficsplitter/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,22 @@ import (
istioclientnetworking "istio.io/client-go/pkg/apis/networking/v1beta1"
)

func UpdateAPI(apiConfig *userconfig.API, force bool) (*spec.API, string, error) {
// UpdateAPI creates or updates a traffic splitter API kind
func UpdateAPI(apiConfig *userconfig.API) (*spec.API, string, error) {
prevVirtualService, err := config.K8s.GetVirtualService(operator.K8sName(apiConfig.Name))
if err != nil {
return nil, "", err
}

api := spec.GetAPISpec(apiConfig, "", "", config.ClusterName())
if prevVirtualService == nil {
if err := config.AWS.UploadJSONToS3(api, config.CoreConfig.Bucket, api.Key); err != nil {
return nil, "", errors.Wrap(err, "upload api spec")
if err := config.UploadJSONToBucket(api, api.Key); err != nil {
return nil, "", errors.Wrap(err, "failed to upload api spec")
}

if err := applyK8sVirtualService(api, prevVirtualService); err != nil {
routines.RunWithPanicHandler(func() {
deleteK8sResources(api.Name)
_ = deleteK8sResources(api.Name)
})
return nil, "", err
}
Expand All @@ -55,8 +56,8 @@ func UpdateAPI(apiConfig *userconfig.API, force bool) (*spec.API, string, error)
}

if prevVirtualService.Labels["specID"] != api.SpecID {
if err := config.AWS.UploadJSONToS3(api, config.CoreConfig.Bucket, api.Key); err != nil {
return nil, "", errors.Wrap(err, "upload api spec")
if err := config.UploadJSONToBucket(api, api.Key); err != nil {
return nil, "", errors.Wrap(err, "failed to upload api spec")
}

if err := applyK8sVirtualService(api, prevVirtualService); err != nil {
Expand All @@ -69,6 +70,7 @@ func UpdateAPI(apiConfig *userconfig.API, force bool) (*spec.API, string, error)
return api, fmt.Sprintf("%s is up to date", api.Resource.UserString()), nil
}

// DeleteAPI deletes all the resources related to a given traffic splitter API
func DeleteAPI(apiName string, keepCache bool) error {
err := parallel.RunFirstErr(
func() error {
Expand All @@ -79,7 +81,7 @@ func DeleteAPI(apiName string, keepCache bool) error {
return nil
}
// best effort deletion
deleteS3Resources(apiName)
_ = deleteS3Resources(apiName)
return nil
},
)
Expand Down Expand Up @@ -115,10 +117,13 @@ func getTrafficSplitterDestinations(trafficSplitter *spec.API) []k8s.Destination
return destinations
}

// GetAllAPIs returns a list of metadata, in the form of schema.APIResponse, about all the created traffic splitter APIs
func GetAllAPIs(virtualServices []istioclientnetworking.VirtualService) ([]schema.APIResponse, error) {
apiNames := []string{}
apiIDs := []string{}
trafficSplitters := []schema.APIResponse{}
var (
apiNames []string
apiIDs []string
trafficSplitters []schema.APIResponse
)

for _, virtualService := range virtualServices {
if virtualService.Labels["apiKind"] == userconfig.TrafficSplitterKind.String() {
Expand Down Expand Up @@ -147,6 +152,7 @@ func GetAllAPIs(virtualServices []istioclientnetworking.VirtualService) ([]schem
return trafficSplitters, nil
}

// GetAPIByName retrieves the metadata, in the form of schema.APIResponse, of a single traffic splitter API
func GetAPIByName(deployedResource *operator.DeployedResource) ([]schema.APIResponse, error) {
api, err := operator.DownloadAPISpec(deployedResource.Name, deployedResource.VirtualService.Labels["apiID"])
if err != nil {
Expand All @@ -173,5 +179,5 @@ func deleteK8sResources(apiName string) error {

func deleteS3Resources(apiName string) error {
prefix := filepath.Join(config.ClusterName(), "apis", apiName)
return config.AWS.DeleteS3Dir(config.CoreConfig.Bucket, prefix, true)
return config.DeleteBucketDir(prefix, true)
}
8 changes: 5 additions & 3 deletions pkg/types/spec/validations.go
Original file line number Diff line number Diff line change
Expand Up @@ -675,10 +675,12 @@ func ExtractAPIConfigs(
return nil, errors.Append(err, fmt.Sprintf("\n\napi configuration schema can be found at https://docs.cortex.dev/v/%s/", consts.CortexVersionMinor))
}

if resourceStruct.Kind == userconfig.BatchAPIKind ||
resourceStruct.Kind == userconfig.TrafficSplitterKind {
if resourceStruct.Kind == userconfig.BatchAPIKind {
if provider == types.GCPProviderType {
return nil, errors.Wrap(ErrorKindIsNotSupportedByProvider(resourceStruct.Kind, provider), userconfig.IdentifyAPI(configFileName, resourceStruct.Name, resourceStruct.Kind, i))
return nil, errors.Wrap(
ErrorKindIsNotSupportedByProvider(resourceStruct.Kind, provider),
userconfig.IdentifyAPI(configFileName, resourceStruct.Name, resourceStruct.Kind, i),
)
}
}

Expand Down