99 "strings"
1010 "time"
1111
12+ "github.com/gorilla/mux"
1213 "github.com/pkg/errors"
1314 appstatetypes "github.com/replicatedhq/replicated-sdk/pkg/appstate/types"
1415 "github.com/replicatedhq/replicated-sdk/pkg/config"
@@ -18,15 +19,16 @@ import (
1819 "github.com/replicatedhq/replicated-sdk/pkg/k8sutil"
1920 sdklicense "github.com/replicatedhq/replicated-sdk/pkg/license"
2021 "github.com/replicatedhq/replicated-sdk/pkg/logger"
22+ "github.com/replicatedhq/replicated-sdk/pkg/meta"
23+ "github.com/replicatedhq/replicated-sdk/pkg/meta/types"
2124 "github.com/replicatedhq/replicated-sdk/pkg/report"
2225 "github.com/replicatedhq/replicated-sdk/pkg/store"
23- "github.com/replicatedhq/replicated-sdk/pkg/tags"
24- "github.com/replicatedhq/replicated-sdk/pkg/tags/types"
2526 "github.com/replicatedhq/replicated-sdk/pkg/upstream"
2627 upstreamtypes "github.com/replicatedhq/replicated-sdk/pkg/upstream/types"
2728 "github.com/replicatedhq/replicated-sdk/pkg/util"
2829 helmrelease "helm.sh/helm/v3/pkg/release"
2930 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
31+ "k8s.io/client-go/kubernetes"
3032 "k8s.io/client-go/kubernetes/scheme"
3133)
3234
@@ -352,6 +354,12 @@ func mockReleaseToAppRelease(mockRelease integrationtypes.MockRelease) AppReleas
352354 return appRelease
353355}
354356
357+ var testClientSet kubernetes.Interface
358+
359+ func SetTestClientSet (clientset kubernetes.Interface ) {
360+ testClientSet = clientset
361+ }
362+
355363func SendCustomAppMetrics (w http.ResponseWriter , r * http.Request ) {
356364 request := SendCustomAppMetricsRequest {}
357365 if err := json .NewDecoder (r .Body ).Decode (& request ); err != nil {
@@ -366,22 +374,60 @@ func SendCustomAppMetrics(w http.ResponseWriter, r *http.Request) {
366374 return
367375 }
368376
377+ var clientset kubernetes.Interface
378+ if testClientSet != nil {
379+ clientset = testClientSet
380+ } else {
381+ var err error
382+ clientset , err = k8sutil .GetClientset ()
383+ if err != nil {
384+ logger .Error (errors .Wrap (err , "failed to get clientset" ))
385+ w .WriteHeader (http .StatusInternalServerError )
386+ return
387+ }
388+ }
389+
390+ overwrite := true
391+ if r .Method == http .MethodPatch {
392+ overwrite = false
393+ }
394+
395+ if err := report .SendCustomAppMetrics (clientset , store .GetStore (), request .Data , overwrite ); err != nil {
396+ logger .Error (errors .Wrap (err , "set application data" ))
397+ w .WriteHeader (http .StatusBadRequest )
398+ return
399+ }
400+
401+ JSON (w , http .StatusOK , "" )
402+ }
403+
404+ func DeleteCustomAppMetricsKey (w http.ResponseWriter , r * http.Request ) {
405+ key , ok := mux .Vars (r )["key" ]
406+
407+ if ! ok || key == "" {
408+ w .WriteHeader (http .StatusBadRequest )
409+ fmt .Fprintf (w , "key cannot be empty" )
410+ logger .Errorf ("cannot delete custom metrics key - key cannot be empty" )
411+ return
412+ }
413+
369414 clientset , err := k8sutil .GetClientset ()
370415 if err != nil {
371416 logger .Error (errors .Wrap (err , "failed to get clientset" ))
372417 w .WriteHeader (http .StatusInternalServerError )
373418 return
374419 }
375420
376- if err := report .SendCustomAppMetrics (clientset , store .GetStore (), request .Data ); err != nil {
377- logger .Error (errors .Wrap (err , "set application data" ))
421+ data := map [string ]interface {}{key : nil }
422+
423+ if err := report .SendCustomAppMetrics (clientset , store .GetStore (), data , false ); err != nil {
424+ logger .Error (errors .Wrapf (err , "failed to delete custom merics key: %s" , key ))
378425 w .WriteHeader (http .StatusBadRequest )
379426 return
380427 }
381428
382- JSON (w , http .StatusOK , "" )
429+ JSON (w , http .StatusNoContent , "" )
383430}
384-
385431func validateCustomAppMetricsData (data CustomAppMetricsData ) error {
386432 if len (data ) == 0 {
387433 return errors .New ("no data provided" )
@@ -429,7 +475,7 @@ func SendAppInstanceTags(w http.ResponseWriter, r *http.Request) {
429475 return
430476 }
431477
432- if err := tags . Save (r .Context (), clientset , store .GetStore ().GetNamespace (), request .Data ); err != nil {
478+ if err := meta . SaveInstanceTag (r .Context (), clientset , store .GetStore ().GetNamespace (), request .Data ); err != nil {
433479 logger .Errorf ("failed to save instance tags: %v" , err )
434480 w .WriteHeader (http .StatusInternalServerError )
435481 return
0 commit comments