Skip to content
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
36 changes: 27 additions & 9 deletions util/argo/resource_tracking.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const (
)

var WrongResourceTrackingFormat = fmt.Errorf("wrong resource tracking format, should be <application-name>;<group>/<kind>/<namespace>/<name>")
var LabelMaxLength = 63

// ResourceTracking defines methods which allow setup and retrieve tracking information to resource
type ResourceTracking interface {
Expand Down Expand Up @@ -49,34 +50,36 @@ func NewResourceTracking() ResourceTracking {
func GetTrackingMethod(settingsMgr *settings.SettingsManager) v1alpha1.TrackingMethod {
tm, err := settingsMgr.GetTrackingMethod()
if err != nil {
return TrackingMethodAnnotationAndLabel
return TrackingMethodLabel
}
return v1alpha1.TrackingMethod(tm)
}

// GetAppName retrieve application name base on tracking method
func (rt *resourceTracking) GetAppName(un *unstructured.Unstructured, key string, trackingMethod v1alpha1.TrackingMethod) string {
switch trackingMethod {
case TrackingMethodLabel:
return argokube.GetAppInstanceLabel(un, key)
case TrackingMethodAnnotation:
retrieveAppInstanceValue := func() string {
appInstanceAnnotation := argokube.GetAppInstanceAnnotation(un, key)
value, err := rt.ParseAppInstanceValue(appInstanceAnnotation)
if err != nil {
return ""
}
return value.ApplicationName
}
switch trackingMethod {
case TrackingMethodLabel:
return argokube.GetAppInstanceLabel(un, key)
case TrackingMethodAnnotationAndLabel:
return retrieveAppInstanceValue()
case TrackingMethodAnnotation:
return retrieveAppInstanceValue()
default:
return argokube.GetAppInstanceLabel(un, key)
}
}

// SetAppInstance set label/annotation base on tracking method
func (rt *resourceTracking) SetAppInstance(un *unstructured.Unstructured, key, val, namespace string, trackingMethod v1alpha1.TrackingMethod) error {
switch trackingMethod {
case TrackingMethodLabel:
return argokube.SetAppInstanceLabel(un, key, val)
case TrackingMethodAnnotation:
setAppInstanceAnnotation := func() error {
ns := un.GetNamespace()
if ns == "" {
ns = namespace
Expand All @@ -90,6 +93,21 @@ func (rt *resourceTracking) SetAppInstance(un *unstructured.Unstructured, key, v
Name: un.GetName(),
}
return argokube.SetAppInstanceAnnotation(un, key, rt.BuildAppInstanceValue(appInstanceValue))
}
switch trackingMethod {
case TrackingMethodLabel:
return argokube.SetAppInstanceLabel(un, key, val)
case TrackingMethodAnnotation:
return setAppInstanceAnnotation()
case TrackingMethodAnnotationAndLabel:
err := setAppInstanceAnnotation()
if err != nil {
return err
}
if len(val) > LabelMaxLength {
val = val[:LabelMaxLength]
}
return argokube.SetAppInstanceLabel(un, key, val)
default:
return argokube.SetAppInstanceLabel(un, key, val)
}
Expand Down
16 changes: 16 additions & 0 deletions util/argo/resource_tracking_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,22 @@ func TestSetAppInstanceAnnotation(t *testing.T) {
assert.Equal(t, "my-app", app)
}

func TestSetAppInstanceAnnotationAndLabel(t *testing.T) {
yamlBytes, err := ioutil.ReadFile("testdata/svc.yaml")
assert.Nil(t, err)
var obj unstructured.Unstructured
err = yaml.Unmarshal(yamlBytes, &obj)
assert.Nil(t, err)

resourceTracking := NewResourceTracking()

err = resourceTracking.SetAppInstance(&obj, common.LabelKeyAppInstance, "my-app", "", TrackingMethodAnnotationAndLabel)
assert.Nil(t, err)

app := resourceTracking.GetAppName(&obj, common.LabelKeyAppInstance, TrackingMethodAnnotationAndLabel)
assert.Equal(t, "my-app", app)
}

func TestSetAppInstanceAnnotationNotFound(t *testing.T) {
yamlBytes, err := ioutil.ReadFile("testdata/svc.yaml")
assert.Nil(t, err)
Expand Down