Skip to content
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

feat: add plugin via api #3937

Merged
merged 43 commits into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
2c6a5e5
create and update added
prakash100198 Sep 1, 2023
0504c14
preparing plugin dtos
prakash100198 Sep 4, 2023
0a7caa1
Merge branch 'main' into add-plugin-via-api
prakash100198 Sep 20, 2023
ca94ab1
create plugin support added
prakash100198 Sep 21, 2023
dfc6a8b
update plugin support
prakash100198 Sep 21, 2023
3bccdb0
deep update plugin support for steps, stepvariable and stepvariableco…
prakash100198 Sep 22, 2023
70bc4c7
delete plugin operation added
prakash100198 Sep 24, 2023
1e774b2
fix for delete pipeline
prakash100198 Sep 24, 2023
005982c
refactoring for updating pluginStep, pluginStepVariables and pluginSt…
prakash100198 Sep 24, 2023
6af1c16
pg no rows handling
prakash100198 Sep 24, 2023
a8cbbab
todo
prakash100198 Sep 24, 2023
ee048ad
Merge branch 'main' into add-plugin-via-api
prakash100198 Sep 28, 2023
7e5ea5f
minor bug fixes
prakash100198 Sep 28, 2023
3b06389
main sync
prakash100198 Oct 4, 2023
606ab2c
one level code review incorporation
prakash100198 Oct 4, 2023
04beebb
2nd level code review incorporation, handling errNoRows, extracting o…
prakash100198 Oct 5, 2023
c8a275a
create and update new plugin tags and plugin tag relations in bul ope…
prakash100198 Oct 5, 2023
4c1bb36
bulk update of plugin variables and plugin step variable conditions i…
prakash100198 Oct 5, 2023
38b025a
Merge branch 'main' into add-plugin-via-api
prakash100198 Oct 5, 2023
6a32685
minor fix for saving tags in bulk
prakash100198 Oct 5, 2023
60e35bc
Merge branch 'main' into add-plugin-via-api
prakash100198 Oct 6, 2023
13f3bc2
Merge branch 'main' into add-plugin-via-api
prakash100198 Oct 13, 2023
e7468e2
create and delete ScriptPathArgPortMapping support given in for addin…
prakash100198 Oct 14, 2023
13b76f3
get ScriptPathArgPortMapping support given in for adding plugin via API
prakash100198 Oct 15, 2023
92a5c50
Merge branch 'main' into add-plugin-via-api
prakash100198 Oct 15, 2023
f20669c
final fixes
prakash100198 Oct 15, 2023
006c40e
Merge branch 'main' into add-plugin-via-api
prakash100198 Oct 30, 2023
aad39b1
Merge branch 'main' into add-plugin-via-api
prakash100198 Oct 31, 2023
5c66b10
Merge branch 'main' into add-plugin-via-api
prakash100198 Nov 1, 2023
5230e6b
several bug fixes after ist iter qa
prakash100198 Nov 1, 2023
91174c9
Merge branch 'main' into add-plugin-via-api
prakash100198 Nov 1, 2023
34b3fb2
Merge branch 'main' into add-plugin-via-api
prakash100198 Nov 2, 2023
d9f3c4a
some code refactoring
prakash100198 Nov 2, 2023
2379e64
removing tag plugin mapping duplicacy
prakash100198 Nov 2, 2023
f72cde9
Merge branch 'main' into add-plugin-via-api
prakash100198 Nov 2, 2023
d5124fc
removing plugin id validation in create req
prakash100198 Nov 2, 2023
ee99020
incorporated validation on plugin create req and update req
prakash100198 Nov 2, 2023
167beb3
changing enum value of ci cd and cicd
prakash100198 Nov 2, 2023
9d2468e
Merge branch 'main' into add-plugin-via-api
prakash100198 Nov 6, 2023
afa659e
Merge branch 'main' into add-plugin-via-api
prakash100198 Nov 16, 2023
5489b63
code review comments incorporation (code refactoring)
prakash100198 Nov 16, 2023
620ec74
comment fix
prakash100198 Nov 17, 2023
e4e4f38
moved audit log to UtilStructs
prakash100198 Nov 17, 2023
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
101 changes: 100 additions & 1 deletion api/restHandler/GlobalPluginRestHandler.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package restHandler

import (
"encoding/json"
"fmt"
"github.com/devtron-labs/devtron/api/restHandler/common"
"github.com/devtron-labs/devtron/pkg/pipeline"
"github.com/devtron-labs/devtron/pkg/plugin"
"github.com/devtron-labs/devtron/pkg/plugin/repository"
"github.com/devtron-labs/devtron/pkg/user"
"github.com/devtron-labs/devtron/pkg/user/casbin"
"github.com/devtron-labs/devtron/util/rbac"
"github.com/gorilla/mux"
Expand All @@ -15,19 +17,25 @@ import (
)

type GlobalPluginRestHandler interface {
PatchPlugin(w http.ResponseWriter, r *http.Request)

GetAllGlobalVariables(w http.ResponseWriter, r *http.Request)
ListAllPlugins(w http.ResponseWriter, r *http.Request)
GetPluginDetailById(w http.ResponseWriter, r *http.Request)
GetDetailedPluginInfoByPluginId(w http.ResponseWriter, r *http.Request)
GetAllDetailedPluginInfo(w http.ResponseWriter, r *http.Request)
}

func NewGlobalPluginRestHandler(logger *zap.SugaredLogger, globalPluginService plugin.GlobalPluginService,
enforcerUtil rbac.EnforcerUtil, enforcer casbin.Enforcer, pipelineBuilder pipeline.PipelineBuilder) *GlobalPluginRestHandlerImpl {
enforcerUtil rbac.EnforcerUtil, enforcer casbin.Enforcer, pipelineBuilder pipeline.PipelineBuilder,
userService user.UserService) *GlobalPluginRestHandlerImpl {
return &GlobalPluginRestHandlerImpl{
logger: logger,
globalPluginService: globalPluginService,
enforcerUtil: enforcerUtil,
enforcer: enforcer,
pipelineBuilder: pipelineBuilder,
userService: userService,
}
}

Expand All @@ -37,6 +45,97 @@ type GlobalPluginRestHandlerImpl struct {
enforcerUtil rbac.EnforcerUtil
enforcer casbin.Enforcer
pipelineBuilder pipeline.PipelineBuilder
userService user.UserService
}

func (handler *GlobalPluginRestHandlerImpl) PatchPlugin(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
userId, err := handler.userService.GetLoggedInUser(r)
if userId == 0 || err != nil {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
var pluginDataDto plugin.PluginMetadataDto
err = decoder.Decode(&pluginDataDto)
if err != nil {
handler.logger.Errorw("request err, PatchPlugin", "error", err, "payload", pluginDataDto)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}
handler.logger.Infow("request payload received for patching plugins", pluginDataDto, "userId", userId)
// RBAC enforcer applying
isSuperAdmin, err := handler.userService.IsSuperAdmin(int(userId))
prakash100198 marked this conversation as resolved.
Show resolved Hide resolved
prakash100198 marked this conversation as resolved.
Show resolved Hide resolved
if !isSuperAdmin || err != nil {
if err != nil {
handler.logger.Errorw("request err, CheckSuperAdmin", "err", err, "isSuperAdmin", isSuperAdmin)
}
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
//RBAC enforcer Ends
pluginData, err := handler.globalPluginService.PatchPlugin(&pluginDataDto, userId)
if err != nil {
handler.logger.Errorw("error in patching plugin data", "action", pluginDataDto.Action, "pluginMetadataPayloadDto", pluginDataDto, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
common.WriteJsonResp(w, nil, pluginData, http.StatusOK)

}
func (handler *GlobalPluginRestHandlerImpl) GetDetailedPluginInfoByPluginId(w http.ResponseWriter, r *http.Request) {
userId, err := handler.userService.GetLoggedInUser(r)
if userId == 0 || err != nil {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
vars := mux.Vars(r)
pluginId, err := strconv.Atoi(vars["pluginId"])
if err != nil {
handler.logger.Errorw("error in converting from string to integer", "userId", userId, "err", err)
prakash100198 marked this conversation as resolved.
Show resolved Hide resolved
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
prakash100198 marked this conversation as resolved.
Show resolved Hide resolved
return
}
// RBAC enforcer applying
isSuperAdmin, err := handler.userService.IsSuperAdmin(int(userId))
if !isSuperAdmin || err != nil {
if err != nil {
handler.logger.Errorw("request err, CheckSuperAdmin", "err", err, "isSuperAdmin", isSuperAdmin)
}
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
//RBAC enforcer Ends
pluginMetaData, err := handler.globalPluginService.GetDetailedPluginInfoByPluginId(pluginId)
if err != nil {
handler.logger.Errorw("error in getting plugin metadata", "pluginId", pluginId, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
common.WriteJsonResp(w, nil, pluginMetaData, http.StatusOK)
}
func (handler *GlobalPluginRestHandlerImpl) GetAllDetailedPluginInfo(w http.ResponseWriter, r *http.Request) {
userId, err := handler.userService.GetLoggedInUser(r)
if userId == 0 || err != nil {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
// RBAC enforcer applying
isSuperAdmin, err := handler.userService.IsSuperAdmin(int(userId))
if !isSuperAdmin || err != nil {
if err != nil {
handler.logger.Errorw("request err, CheckSuperAdmin", "err", err, "isSuperAdmin", isSuperAdmin)
}
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
//RBAC enforcer Ends
pluginMetaData, err := handler.globalPluginService.GetAllDetailedPluginInfo()
if err != nil {
handler.logger.Errorw("error in getting all plugins metadata", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
common.WriteJsonResp(w, nil, pluginMetaData, http.StatusOK)
}

func (handler *GlobalPluginRestHandlerImpl) GetAllGlobalVariables(w http.ResponseWriter, r *http.Request) {
Expand Down
13 changes: 10 additions & 3 deletions api/router/GlobalPluginRouter.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,19 @@ type GlobalPluginRouterImpl struct {
}

func (impl *GlobalPluginRouterImpl) initGlobalPluginRouter(globalPluginRouter *mux.Router) {
globalPluginRouter.Path("/global/list/global-variable").
globalPluginRouter.Path("").
HandlerFunc(impl.globalPluginRestHandler.PatchPlugin).Methods("POST")
globalPluginRouter.Path("/detail/all").
HandlerFunc(impl.globalPluginRestHandler.GetAllDetailedPluginInfo).Methods("GET")
globalPluginRouter.Path("/detail/{pluginId}").
HandlerFunc(impl.globalPluginRestHandler.GetDetailedPluginInfoByPluginId).Methods("GET")

globalPluginRouter.Path("/list/global-variable").
HandlerFunc(impl.globalPluginRestHandler.GetAllGlobalVariables).Methods("GET")

globalPluginRouter.Path("/global/list").
globalPluginRouter.Path("/list").
HandlerFunc(impl.globalPluginRestHandler.ListAllPlugins).Methods("GET")

globalPluginRouter.Path("/global/{pluginId}").
globalPluginRouter.Path("/{pluginId}").
HandlerFunc(impl.globalPluginRestHandler.GetPluginDetailById).Methods("GET")
}
2 changes: 1 addition & 1 deletion api/router/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ func (r MuxRouter) Init() {
pProfListenerRouter := r.Router.PathPrefix("/orchestrator/debug/pprof").Subrouter()
r.pProfRouter.initPProfRouter(pProfListenerRouter)

globalPluginRouter := r.Router.PathPrefix("/orchestrator/plugin").Subrouter()
globalPluginRouter := r.Router.PathPrefix("/orchestrator/plugin/global").Subrouter()
r.globalPluginRouter.initGlobalPluginRouter(globalPluginRouter)

// deployment router starts
Expand Down
2 changes: 1 addition & 1 deletion internal/sql/repository/CiArtifactRepository.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ func (impl CiArtifactRepositoryImpl) GetLatestArtifactTimeByCiPipelineIds(ciPipe
return artifacts, nil
}

//GetLatestArtifactTimeByCiPipelineId will fetch latest ci artifact time(created) against that ci pipeline
// GetLatestArtifactTimeByCiPipelineId will fetch latest ci artifact time(created) against that ci pipeline
func (impl CiArtifactRepositoryImpl) GetLatestArtifactTimeByCiPipelineId(ciPipelineId int) (*CiArtifact, error) {
artifacts := &CiArtifact{}
query := "select cws.pipeline_id, cws.created_on from " +
Expand Down
4 changes: 2 additions & 2 deletions pkg/pipeline/WorkflowService.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ const (
CI_NODE_PVC_PIPELINE_PREFIX = "devtron.ai/ci-pvc"
PRE = "PRE"
POST = "POST"
preCdStage = "preCD"
postCdStage = "postCD"
preCdStage = "preCD"
postCdStage = "postCD"
)

func (impl *WorkflowServiceImpl) SubmitWorkflow(workflowRequest *WorkflowRequest) (*unstructured.UnstructuredList, error) {
Expand Down
2 changes: 1 addition & 1 deletion pkg/pipeline/mock_pipeline/PipelineBuilder.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions pkg/pipeline/repository/PipelineStageRepository.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ type PipelineStageRepository interface {
GetStepById(stepId int) (*PipelineStageStep, error)
MarkStepsDeletedByStageId(stageId int) error
MarkStepsDeletedExcludingActiveStepsInUpdateReq(activeStepIdsPresentInReq []int, stageId int) error
GetActiveStepsByRefPluginId(refPluginId int) ([]*PipelineStageStep, error)

CreatePipelineScript(pipelineScript *PluginPipelineScript, tx *pg.Tx) (*PluginPipelineScript, error)
UpdatePipelineScript(pipelineScript *PluginPipelineScript) (*PluginPipelineScript, error)
Expand Down Expand Up @@ -417,6 +418,18 @@ func (impl *PipelineStageRepositoryImpl) MarkStepsDeletedExcludingActiveStepsInU
return nil
}

func (impl *PipelineStageRepositoryImpl) GetActiveStepsByRefPluginId(refPluginId int) ([]*PipelineStageStep, error) {
var steps []*PipelineStageStep
err := impl.dbConnection.Model(&steps).
Where("ref_plugin_id = ?", refPluginId).
Where("deleted = ?", false).Select()
if err != nil {
impl.logger.Errorw("err in getting all steps by refPluginId", "err", err, "refPluginId", refPluginId)
return nil, err
}
return steps, nil
}

func (impl *PipelineStageRepositoryImpl) CreatePipelineScript(pipelineScript *PluginPipelineScript, tx *pg.Tx) (*PluginPipelineScript, error) {
var err error
if tx != nil {
Expand Down
Loading
Loading