Skip to content

Commit 24404b9

Browse files
subhashish-devtronavdhesh-devtronadi6859kripanshdevtronprakash100198
authored
feat: Scoped variable Support (#397)
* add core functions * added the branch change API * Add unit tests * Allow source change only in customApp * Refactor tests * Add logs * Refactor API * Add API to change chart ref id * Find app metrics * Fix issues * Patch winter soldier config * Add flaggerCanary Check * Add error message when env.Ovverride is not set * Add source type check * Add Spec for /orchestrator/app/ci-pipeline/patch-source * Refactor and add spec * added variable repo and service for entity mapping and history * added audit * added markers for integration points * repository file added * added markers for gojson validatipn for templates * using variable names instead of ids * var template resolve * ScopedVariableService.go added * folder structure changed * changes in bean file added * UTs * adding integrations * files added for restHandler and router * signature change * working build * merged main and added integrations(partial) for config drafts * added missing mappings * bug fixed in variable definition * tested for scoped variable * nil pointer handled * fixes and tests * quotes handling in template added * fixes * fixes and tests * parse template as stringify template * json function added * gloval variable not getting saved issues fixed * issue in GetScopedVariableDataForVarIds fixed * delete functionality added * handle defaulted variables * testing fixes * testing fixes * getting global variable issue fixed * get scopeVariable function merged * adding len check * removed argo-cd assets copy, will fix later * removed enity from validate * added dockerfile update * validation added * validation added * error handled for scope * validation added for complex datatype * file for schema json added * nil value for payload added in case of empty variable * error handling in rest handler * resolved vars history * yaml validator added * validation for character length added * more test cases * passing cluster ID in config draft for scope resolution * primitive type validation added * differentiator added for string * adding spec version check * code refactored around variable definition * bug fix * sync dependencies * added new spec with transformer * type string to int * bug fixed around getting scoped variable * bug fixed around getting scoped variable * bug fixed around transformer * minor type change * scope fix for latest saved config * dockerfile * sql down script added and some function moved to helper * Revert "dockerfile" This reverts commit ecf8637. * env driven validation added * added argo-cd asssets in vendor from main * logger message added * selector spec fix * fix no variables found case * fixes * omitempty added for selectors * validation removed for Selectors * issue fixed around getting json * variable type handling * toInt and toBool func registered * json template parsing * json parser fix * variable parser fix * logging fix * variable value duplication issue fixed * variable service refactoring * high level refactoring scopedvariableservice * getting env repo call for clusterId removed * cleaning and optimizing getScoped Data * fix nil array * go mod vendor * refactoring variable helper * cleaned comments * added cache handling for getJson * extended compounded qualifier logic for finding matched scope * unit test case added for createVariable and IsValidPayload method * bug fixes * fix: Makefile correction (#3852) * GOFLAGS flag introduced in * ea makefile fix * bug fixes * feat: scoped vars squashed * synced changes from feature branch d9bd011^..116728c * getScoped variable with Details handling * fixed logic for get scoped repo call * enterprise sync * added missing vendor files from main * validation-error file added for showing error code 406 for validation * validation-error file added for showing error code 406 for validation * all test cases added for scoped variable service * variable template parser * oss sync miss * refactored parseTemplate changes incorporated * commented out duplicate test case * short description and isSensitive is added * pointer handling * check added for superadmin to show data * *** added in case of private variable * test cases added for private variable * test cases updated for private variable * isRedacted is added for FE handling * some code review changes done * varType to Variable type * name of documentation and description has been changed * fixing last deployed deployment bug introduced after template parser code changes * fixing last deployed deployment bug introduced after template parser code changes * QA bug fix * minor code cleaning * typo fix * cleaning dead comments --------- Co-authored-by: Avdhesh Kumar <[email protected]> Co-authored-by: avdhesh-devtron <[email protected]> Co-authored-by: adi6859 <[email protected]> Co-authored-by: Kripansh <[email protected]> Co-authored-by: Prakash <[email protected]>
1 parent 9a54dac commit 24404b9

File tree

418 files changed

+78293
-1132
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

418 files changed

+78293
-1132
lines changed

Wire.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import (
4141
"github.com/devtron-labs/devtron/api/module"
4242
"github.com/devtron-labs/devtron/api/restHandler"
4343
pipeline2 "github.com/devtron-labs/devtron/api/restHandler/app"
44+
"github.com/devtron-labs/devtron/api/restHandler/scopedVariable"
4445
"github.com/devtron-labs/devtron/api/router"
4546
"github.com/devtron-labs/devtron/api/router/pubsub"
4647
"github.com/devtron-labs/devtron/api/server"
@@ -122,6 +123,9 @@ import (
122123
"github.com/devtron-labs/devtron/pkg/sql"
123124
client2 "github.com/devtron-labs/devtron/pkg/user/casbin"
124125
util3 "github.com/devtron-labs/devtron/pkg/util"
126+
"github.com/devtron-labs/devtron/pkg/variables"
127+
"github.com/devtron-labs/devtron/pkg/variables/parsers"
128+
repository10 "github.com/devtron-labs/devtron/pkg/variables/repository"
125129
util2 "github.com/devtron-labs/devtron/util"
126130
"github.com/devtron-labs/devtron/util/argo"
127131
util4 "github.com/devtron-labs/devtron/util/k8s"
@@ -248,6 +252,25 @@ func InitializeApp() (*App, error) {
248252
wire.Bind(new(util.ChartTemplateService), new(*util.ChartTemplateServiceImpl)),
249253
util.NewChartDeploymentServiceImpl,
250254
wire.Bind(new(util.ChartDeploymentService), new(*util.ChartDeploymentServiceImpl)),
255+
256+
//scoped variables start
257+
variables.NewScopedVariableServiceImpl,
258+
wire.Bind(new(variables.ScopedVariableService), new(*variables.ScopedVariableServiceImpl)),
259+
260+
parsers.NewVariableTemplateParserImpl,
261+
wire.Bind(new(parsers.VariableTemplateParser), new(*parsers.VariableTemplateParserImpl)),
262+
repository10.NewVariableEntityMappingRepository,
263+
wire.Bind(new(repository10.VariableEntityMappingRepository), new(*repository10.VariableEntityMappingRepositoryImpl)),
264+
265+
repository10.NewVariableSnapshotHistoryRepository,
266+
wire.Bind(new(repository10.VariableSnapshotHistoryRepository), new(*repository10.VariableSnapshotHistoryRepositoryImpl)),
267+
variables.NewVariableEntityMappingServiceImpl,
268+
wire.Bind(new(variables.VariableEntityMappingService), new(*variables.VariableEntityMappingServiceImpl)),
269+
variables.NewVariableSnapshotHistoryServiceImpl,
270+
wire.Bind(new(variables.VariableSnapshotHistoryService), new(*variables.VariableSnapshotHistoryServiceImpl)),
271+
272+
//end
273+
251274
chart.NewChartServiceImpl,
252275
wire.Bind(new(chart.ChartService), new(*chart.ChartServiceImpl)),
253276
bulkAction.NewBulkUpdateServiceImpl,
@@ -446,6 +469,9 @@ func InitializeApp() (*App, error) {
446469
chartConfig.NewPipelineConfigRepository,
447470
wire.Bind(new(chartConfig.PipelineConfigRepository), new(*chartConfig.PipelineConfigRepositoryImpl)),
448471

472+
repository10.NewScopedVariableRepository,
473+
wire.Bind(new(repository10.ScopedVariableRepository), new(*repository10.ScopedVariableRepositoryImpl)),
474+
449475
repository.NewLinkoutsRepositoryImpl,
450476
wire.Bind(new(repository.LinkoutsRepository), new(*repository.LinkoutsRepositoryImpl)),
451477

@@ -643,6 +669,11 @@ func InitializeApp() (*App, error) {
643669
restHandler.NewCommonRestHandlerImpl,
644670
wire.Bind(new(restHandler.CommonRestHandler), new(*restHandler.CommonRestHandlerImpl)),
645671

672+
router.NewScopedVariableRouterImpl,
673+
wire.Bind(new(router.ScopedVariableRouter), new(*router.ScopedVariableRouterImpl)),
674+
scopedVariable.NewScopedVariableRestHandlerImpl,
675+
wire.Bind(new(scopedVariable.ScopedVariableRestHandler), new(*scopedVariable.ScopedVariableRestHandlerImpl)),
676+
646677
util.NewGitCliUtil,
647678

648679
router.NewTelemetryRouterImpl,

api/bean/AppView.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ type Environment struct {
205205
DeploymentAppDeleteRequest bool `json:"deploymentAppDeleteRequest"`
206206
Description string `json:"description" validate:"max=40"`
207207
IsVirtualEnvironment bool `json:"isVirtualEnvironment"`
208+
ClusterId int `json:"clusterId"`
208209
}
209210

210211
type InstanceDetail struct {

api/restHandler/app/DeploymentPipelineRestHandler.go

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/devtron-labs/devtron/pkg/pipeline"
1818
bean3 "github.com/devtron-labs/devtron/pkg/pipeline/bean"
1919
"github.com/devtron-labs/devtron/pkg/user/casbin"
20+
"github.com/devtron-labs/devtron/pkg/variables/models"
2021
"github.com/go-pg/pg"
2122
"github.com/gorilla/mux"
2223
"go.opentelemetry.io/otel"
@@ -108,8 +109,11 @@ func (handler PipelineConfigRestHandlerImpl) ConfigureDeploymentTemplateForApp(w
108109
return
109110
}
110111
chartRefId := templateRequest.ChartRefId
111-
112-
validate, err2 := handler.chartService.DeploymentTemplateValidate(r.Context(), templateRequest.ValuesOverride, chartRefId)
112+
//VARIABLE_RESOLVE
113+
scope := models.Scope{
114+
AppId: templateRequest.AppId,
115+
}
116+
validate, err2 := handler.chartService.DeploymentTemplateValidate(r.Context(), templateRequest.ValuesOverride, chartRefId, scope)
113117
if !validate {
114118
common.WriteJsonResp(w, err2, nil, http.StatusBadRequest)
115119
return
@@ -570,7 +574,13 @@ func (handler PipelineConfigRestHandlerImpl) ChangeChartRef(w http.ResponseWrite
570574
return
571575
}
572576

573-
validate, err2 := handler.chartService.DeploymentTemplateValidate(r.Context(), envConfigProperties.EnvOverrideValues, envConfigProperties.ChartRefId)
577+
//VARIABLE_RESOLVE
578+
scope := models.Scope{
579+
AppId: request.AppId,
580+
EnvId: request.EnvId,
581+
ClusterId: envConfigProperties.ClusterId,
582+
}
583+
validate, err2 := handler.chartService.DeploymentTemplateValidate(r.Context(), envConfigProperties.EnvOverrideValues, envConfigProperties.ChartRefId, scope)
574584
if !validate {
575585
handler.Logger.Errorw("validation err, UpdateAppOverride", "err", err2, "payload", request)
576586
common.WriteJsonResp(w, err2, "validation err, UpdateAppOverrid", http.StatusBadRequest)
@@ -693,7 +703,13 @@ func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideCreate(w http.Resp
693703
}
694704

695705
chartRefId := envConfigProperties.ChartRefId
696-
validate, err2 := handler.chartService.DeploymentTemplateValidate(r.Context(), envConfigProperties.EnvOverrideValues, chartRefId)
706+
//VARIABLE_RESOLVE
707+
scope := models.Scope{
708+
AppId: appId,
709+
EnvId: environmentId,
710+
ClusterId: envConfigProperties.ClusterId,
711+
}
712+
validate, err2 := handler.chartService.DeploymentTemplateValidate(r.Context(), envConfigProperties.EnvOverrideValues, chartRefId, scope)
697713
if !validate {
698714
handler.Logger.Errorw("validation err, UpdateAppOverride", "err", err2, "payload", envConfigProperties)
699715
common.WriteJsonResp(w, err2, nil, http.StatusBadRequest)
@@ -802,7 +818,13 @@ func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideUpdate(w http.Resp
802818
return
803819
}
804820
chartRefId := envConfigProperties.ChartRefId
805-
validate, err2 := handler.chartService.DeploymentTemplateValidate(r.Context(), envConfigProperties.EnvOverrideValues, chartRefId)
821+
//VARIABLE_RESOLVE
822+
scope := models.Scope{
823+
AppId: appId,
824+
EnvId: envId,
825+
ClusterId: envConfigProperties.ClusterId,
826+
}
827+
validate, err2 := handler.chartService.DeploymentTemplateValidate(r.Context(), envConfigProperties.EnvOverrideValues, chartRefId, scope)
806828
if !validate {
807829
handler.Logger.Errorw("validation err, UpdateAppOverride", "err", err2, "payload", envConfigProperties)
808830
common.WriteJsonResp(w, err2, nil, http.StatusBadRequest)
@@ -1366,8 +1388,12 @@ func (handler PipelineConfigRestHandlerImpl) UpdateAppOverride(w http.ResponseWr
13661388
return
13671389
}
13681390
chartRefId := templateRequest.ChartRefId
1391+
//VARIABLE_RESOLVE
1392+
scope := models.Scope{
1393+
AppId: templateRequest.AppId,
1394+
}
13691395
_, span = otel.Tracer("orchestrator").Start(ctx, "chartService.DeploymentTemplateValidate")
1370-
validate, err2 := handler.chartService.DeploymentTemplateValidate(ctx, templateRequest.ValuesOverride, chartRefId)
1396+
validate, err2 := handler.chartService.DeploymentTemplateValidate(ctx, templateRequest.ValuesOverride, chartRefId, scope)
13711397
span.End()
13721398
if !validate {
13731399
handler.Logger.Errorw("validation err, UpdateAppOverride", "err", err2, "payload", templateRequest)
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
package scopedVariable
2+
3+
import (
4+
"encoding/json"
5+
"errors"
6+
"fmt"
7+
"github.com/devtron-labs/devtron/api/restHandler/common"
8+
"github.com/devtron-labs/devtron/pkg/bean"
9+
"github.com/devtron-labs/devtron/pkg/pipeline"
10+
"github.com/devtron-labs/devtron/pkg/user"
11+
"github.com/devtron-labs/devtron/pkg/user/casbin"
12+
"github.com/devtron-labs/devtron/pkg/variables"
13+
"github.com/devtron-labs/devtron/pkg/variables/models"
14+
"github.com/devtron-labs/devtron/pkg/variables/utils"
15+
"github.com/devtron-labs/devtron/util"
16+
"github.com/devtron-labs/devtron/util/rbac"
17+
"go.uber.org/zap"
18+
"gopkg.in/go-playground/validator.v9"
19+
"net/http"
20+
"strconv"
21+
)
22+
23+
type ScopedVariableRestHandler interface {
24+
CreateVariables(w http.ResponseWriter, r *http.Request)
25+
GetScopedVariables(w http.ResponseWriter, r *http.Request)
26+
GetJsonForVariables(w http.ResponseWriter, r *http.Request)
27+
}
28+
29+
type ScopedVariableRestHandlerImpl struct {
30+
logger *zap.SugaredLogger
31+
userAuthService user.UserService
32+
validator *validator.Validate
33+
pipelineBuilder pipeline.PipelineBuilder
34+
enforcerUtil rbac.EnforcerUtil
35+
enforcer casbin.Enforcer
36+
scopedVariableService variables.ScopedVariableService
37+
}
38+
type JsonResponse struct {
39+
Manifest *models.ScopedVariableManifest `json:"manifest"`
40+
JsonSchema string `json:"jsonSchema"`
41+
}
42+
43+
func NewScopedVariableRestHandlerImpl(logger *zap.SugaredLogger, userAuthService user.UserService, validator *validator.Validate, pipelineBuilder pipeline.PipelineBuilder, enforcerUtil rbac.EnforcerUtil, enforcer casbin.Enforcer, scopedVariableService variables.ScopedVariableService) *ScopedVariableRestHandlerImpl {
44+
return &ScopedVariableRestHandlerImpl{
45+
logger: logger,
46+
userAuthService: userAuthService,
47+
validator: validator,
48+
pipelineBuilder: pipelineBuilder,
49+
enforcerUtil: enforcerUtil,
50+
enforcer: enforcer,
51+
scopedVariableService: scopedVariableService,
52+
}
53+
}
54+
func (handler *ScopedVariableRestHandlerImpl) CreateVariables(w http.ResponseWriter, r *http.Request) {
55+
decoder := json.NewDecoder(r.Body)
56+
userId, err := handler.userAuthService.GetLoggedInUser(r)
57+
if userId == 0 || err != nil {
58+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
59+
return
60+
}
61+
request := models.VariableRequest{}
62+
decoder.UseNumber()
63+
err = decoder.Decode(&request)
64+
if err != nil {
65+
handler.logger.Errorw("request err, Save", "error", err, "request", request)
66+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
67+
return
68+
}
69+
request.UserId = userId
70+
71+
// validate request
72+
err = handler.validator.Struct(request)
73+
if err != nil {
74+
handler.logger.Errorw("struct validation err in CreateVariables", "err", err, "request", request)
75+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
76+
return
77+
}
78+
79+
payload := utils.ManifestToPayload(request.Manifest, userId)
80+
81+
// not logging bean object as it contains sensitive data
82+
handler.logger.Infow("request payload received for variables")
83+
84+
// RBAC enforcer applying
85+
isSuperAdmin, err := handler.userAuthService.IsSuperAdmin(int(userId))
86+
if !isSuperAdmin || err != nil {
87+
if err != nil {
88+
handler.logger.Errorw("request err, CheckSuperAdmin", "err", err, "isSuperAdmin", isSuperAdmin)
89+
}
90+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
91+
return
92+
}
93+
//RBAC enforcer Ends
94+
err = handler.scopedVariableService.CreateVariables(payload)
95+
if err != nil {
96+
if errors.As(err, &models.ValidationError{}) {
97+
common.WriteJsonResp(w, err, nil, http.StatusNotAcceptable)
98+
} else {
99+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
100+
}
101+
return
102+
}
103+
common.WriteJsonResp(w, nil, nil, http.StatusOK)
104+
}
105+
func (handler *ScopedVariableRestHandlerImpl) GetScopedVariables(w http.ResponseWriter, r *http.Request) {
106+
userId, err := handler.userAuthService.GetLoggedInUser(r)
107+
if err != nil {
108+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
109+
return
110+
}
111+
isSuperAdmin, err := handler.userAuthService.IsSuperAdmin(int(userId))
112+
113+
if err != nil {
114+
handler.logger.Errorw("request err, CheckSuperAdmin", "err", err, "isSuperAdmin", isSuperAdmin)
115+
return
116+
}
117+
118+
appIdQueryParam := r.URL.Query().Get("appId")
119+
var appId int
120+
appId, err = strconv.Atoi(appIdQueryParam)
121+
if err != nil {
122+
common.WriteJsonResp(w, err, "invalid appId", http.StatusBadRequest)
123+
return
124+
}
125+
126+
var scope models.Scope
127+
scopeQueryParam := r.URL.Query().Get("scope")
128+
if scopeQueryParam != "" {
129+
if err := json.Unmarshal([]byte(scopeQueryParam), &scope); err != nil {
130+
http.Error(w, "Invalid JSON format for 'scope' parameter", http.StatusBadRequest)
131+
return
132+
}
133+
}
134+
if scope.AppId != 0 && scope.AppId != appId {
135+
http.Error(w, "scope.AppId provided in scope is not equal to appId", http.StatusBadRequest)
136+
return
137+
}
138+
139+
token := r.Header.Get("token")
140+
var app *bean.CreateAppDTO
141+
app, err = handler.pipelineBuilder.GetApp(appId)
142+
if err != nil {
143+
handler.logger.Errorw("service err, GetScopedVariables", "err", err, "payload", scope.AppId, scope.EnvId, scope.ClusterId)
144+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
145+
return
146+
}
147+
handler.logger.Infow("request payload, GetScopedVariables", "payload", scope.AppId, scope.EnvId, scope.ClusterId)
148+
resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName)
149+
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionGet, resourceName); !ok {
150+
common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden)
151+
return
152+
}
153+
var scopedVariableData []*models.ScopedVariableData
154+
155+
scopedVariableData, err = handler.scopedVariableService.GetScopedVariables(scope, nil, isSuperAdmin)
156+
if err != nil {
157+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
158+
return
159+
}
160+
common.WriteJsonResp(w, nil, scopedVariableData, http.StatusOK)
161+
162+
}
163+
func (handler *ScopedVariableRestHandlerImpl) GetJsonForVariables(w http.ResponseWriter, r *http.Request) {
164+
userId, err := handler.userAuthService.GetLoggedInUser(r)
165+
if userId == 0 || err != nil {
166+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
167+
return
168+
}
169+
// not logging bean object as it contains sensitive data
170+
handler.logger.Infow("request payload received for variables")
171+
172+
// RBAC enforcer applying
173+
isSuperAdmin, err := handler.userAuthService.IsSuperAdmin(int(userId))
174+
if !isSuperAdmin || err != nil {
175+
if err != nil {
176+
handler.logger.Errorw("request err, CheckSuperAdmin", "err", err, "isSuperAdmin", isSuperAdmin)
177+
}
178+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
179+
return
180+
}
181+
//RBAC enforcer Ends
182+
//var payload *repository.Payload
183+
184+
payload, err := handler.scopedVariableService.GetJsonForVariables()
185+
if err != nil {
186+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
187+
return
188+
}
189+
190+
schema, err := util.GetSchemaFromType(models.ScopedVariableManifest{})
191+
if err != nil {
192+
common.WriteJsonResp(w, err, "schema cannot be generated for manifest type", http.StatusInternalServerError)
193+
return
194+
}
195+
196+
jsonResponse := JsonResponse{
197+
JsonSchema: schema,
198+
}
199+
200+
if payload != nil {
201+
manifest := utils.PayloadToManifest(*payload)
202+
jsonResponse.Manifest = &manifest
203+
}
204+
common.WriteJsonResp(w, nil, jsonResponse, http.StatusOK)
205+
}

api/router/ScopedVariableRouter.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package router
2+
3+
import (
4+
"github.com/devtron-labs/devtron/api/restHandler/scopedVariable"
5+
"github.com/gorilla/mux"
6+
)
7+
8+
type ScopedVariableRouter interface {
9+
InitScopedVariableRouter(router *mux.Router)
10+
}
11+
12+
type ScopedVariableRouterImpl struct {
13+
scopedVariableRestHandler scopedVariable.ScopedVariableRestHandler
14+
}
15+
16+
func NewScopedVariableRouterImpl(scopedVariableRestHandler scopedVariable.ScopedVariableRestHandler) *ScopedVariableRouterImpl {
17+
router := &ScopedVariableRouterImpl{
18+
scopedVariableRestHandler: scopedVariableRestHandler,
19+
}
20+
return router
21+
}
22+
23+
func (impl ScopedVariableRouterImpl) InitScopedVariableRouter(router *mux.Router) {
24+
router.Path("/variables").
25+
HandlerFunc(impl.scopedVariableRestHandler.CreateVariables).
26+
Methods("POST")
27+
router.Path("/variables").
28+
HandlerFunc(impl.scopedVariableRestHandler.GetScopedVariables).
29+
Methods("GET")
30+
router.Path("/variables/detail").
31+
HandlerFunc(impl.scopedVariableRestHandler.GetJsonForVariables).
32+
Methods("GET")
33+
34+
}

0 commit comments

Comments
 (0)