Skip to content
Merged
Show file tree
Hide file tree
Changes from 82 commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
49ca2bf
API for getApiResources for a cluster
manish-agrawal-ai Dec 29, 2022
9b8e6cf
update resource api
manish-agrawal-ai Dec 29, 2022
26ff223
resource delete API change
manish-agrawal-ai Dec 29, 2022
3a20b8c
native k8s support added for APIs
kripanshdevtron Dec 29, 2022
8aed4a8
gkv resource list api spec added
vikramdevtron Dec 30, 2022
c19e59f
added gkv resource list api
vikramdevtron Dec 30, 2022
54a78ac
resource list request dto modified
vikramdevtron Dec 30, 2022
0048883
added script
kartik-579 Dec 30, 2022
2074eef
namespaces api for cluster
kripanshdevtron Dec 30, 2022
4ec57f3
status added for resource list
vikramdevtron Dec 30, 2022
b7bd085
Merge branch 'resource_browser' of https://github.com/devtron-labs/de…
vikramdevtron Dec 30, 2022
409b622
create resources API
manish-agrawal-ai Dec 30, 2022
ddd1c09
bug fix in get api-resources API
manish-agrawal-ai Dec 30, 2022
43a3521
events list api modified, for all gkv or by namespace
vikramdevtron Dec 30, 2022
efeef39
Merge branch 'resource_browser' of https://github.com/devtron-labs/de…
vikramdevtron Dec 30, 2022
602906c
bug fixes
manish-agrawal-ai Dec 30, 2022
06768c5
added cluster rbac for roleGroup
kartik-579 Dec 30, 2022
51b8461
createResources changed to applyResources
manish-agrawal-ai Dec 30, 2022
e0615b0
updated cluster entity for create/update user apis
kartik-579 Dec 30, 2022
d32c2be
api refactored
kripanshdevtron Dec 30, 2022
9a2a533
extracted code for checking cluster entity rbac
kartik-579 Dec 30, 2022
e277377
added casbin sql script for superadmin cluster entity policies
kartik-579 Dec 30, 2022
0560f2c
updated spec
kartik-579 Dec 30, 2022
3365eb7
Merge branch 'cluster-rbac' into resource_browser
kripanshdevtron Dec 31, 2022
5b96ba3
applyResource change to createOrUpdate
manish-agrawal-ai Dec 31, 2022
9ab657b
review changes and event list for all gkv fixed
vikramdevtron Dec 31, 2022
2ed1686
conflicts resolved with apply resource
vikramdevtron Dec 31, 2022
88579be
containers list added in resource list api
vikramdevtron Dec 31, 2022
515e675
auth for resource list api
vikramdevtron Dec 31, 2022
67da071
global kind event check added for event listing
vikramdevtron Dec 31, 2022
e2e711b
conflict resolve
vikramdevtron Dec 31, 2022
976c79f
wip -fixes
kartik-579 Dec 31, 2022
50c27ec
wip -fixes
kartik-579 Dec 31, 2022
abae9c5
rbac for k8s event listing
vikramdevtron Jan 2, 2023
f511644
rbac changes for k8s resource list and event list
vikramdevtron Jan 2, 2023
0d1a6fa
Merge branch 'main' into resource_browser
manish-agrawal-ai Jan 2, 2023
4ca862b
sql file renamed and wire
manish-agrawal-ai Jan 2, 2023
3ca7067
Merge branch 'resource_browser' into resource_browser_rbac
vikramdevtron Jan 2, 2023
69a45e7
namespace bug fix
manish-agrawal-ai Jan 2, 2023
73cb775
Merge branch 'resource_browser' into resource_browser_rbac
kripanshdevtron Jan 2, 2023
68d7702
added new api permission cluster list
vikramdevtron Jan 2, 2023
e59a841
Merge branch 'resource_browser' of https://github.com/devtron-labs/de…
vikramdevtron Jan 2, 2023
cc2dcdb
cluster extended wire fix, resource not found check
vikramdevtron Jan 2, 2023
547d6ba
fix
vikramdevtron Jan 2, 2023
dc5e5cb
added check for timestamp for resource list
vikramdevtron Jan 2, 2023
b6f9048
event and gvk api bug fix
manish-agrawal-ai Jan 2, 2023
3432a19
resourceIf with acceptHeader for getReeourceList API
manish-agrawal-ai Jan 2, 2023
0334ccb
resource list api response modified
vikramdevtron Jan 2, 2023
2a1b93a
refactor resource listing and added namespace
vikramdevtron Jan 3, 2023
8ea1e13
refactoring
manish-agrawal-ai Jan 3, 2023
aa1f4d4
review comment - itr1
kartik-579 Jan 3, 2023
a408ed9
merged
manish-agrawal-ai Jan 3, 2023
59a0fc6
event listing changes revert and added updated api spec for cluster l…
vikramdevtron Jan 3, 2023
8b3418c
RBAC apply handling added
kripanshdevtron Jan 3, 2023
7a4ff08
Merge branch 'resource_browser' into resource_browser_rbac
kripanshdevtron Jan 3, 2023
f7a6b87
code cleanup
kripanshdevtron Jan 3, 2023
7fff03d
Merge branch 'cluster-rbac' into resource_browser
kartik-579 Jan 3, 2023
a5fa9ea
Merge branch 'resource_browser' into resource_browser_rbac
kripanshdevtron Jan 3, 2023
c035600
Merge branch 'resource_browser_rbac' of https://github.com/devtron-la…
vikramdevtron Jan 3, 2023
9be8cd7
bug fix
manish-agrawal-ai Jan 3, 2023
f1d4e99
reverted file change
manish-agrawal-ai Jan 3, 2023
62c5575
auth on namespace list
vikramdevtron Jan 3, 2023
97898f1
removed unused struct
manish-agrawal-ai Jan 3, 2023
8bcc4ce
resource browser RBAC handling
kripanshdevtron Jan 3, 2023
9b9ff13
Merge branch 'resource_browser_rbac' of https://github.com/devtron-la…
kripanshdevtron Jan 3, 2023
b7c66de
code cleanup
kripanshdevtron Jan 3, 2023
c85b335
safe checks added
manish-agrawal-ai Jan 3, 2023
cb3e4b4
not setting namespace in resource list API if gvk is global
manish-agrawal-ai Jan 3, 2023
0bc09b8
patch fix
kripanshdevtron Jan 3, 2023
cdb7e8c
Merge branch 'resource_browser_rbac' into resource_browser
kripanshdevtron Jan 3, 2023
a08ee6d
namespaced handling
kripanshdevtron Jan 3, 2023
7be96b1
compile fix
manish-agrawal-ai Jan 3, 2023
6d9a9b7
cluster and namespace list api handling for super admin
vikramdevtron Jan 3, 2023
feff22d
review change
kartik-579 Jan 3, 2023
7e7401a
resource listing for global kind event customize, and fix for namespa…
vikramdevtron Jan 3, 2023
c6d19f8
Merge branch 'resource_browser' of https://github.com/devtron-labs/de…
vikramdevtron Jan 3, 2023
5ac314b
refactoring
manish-agrawal-ai Jan 3, 2023
92b44dc
aply resource bug fix
manish-agrawal-ai Jan 4, 2023
3c06ffd
nil pointer fix
manish-agrawal-ai Jan 4, 2023
8886ea8
Merge branch 'main' into resource_browser
manish-agrawal-ai Jan 4, 2023
c9dce1d
wire file
manish-agrawal-ai Jan 4, 2023
c561485
down file change
manish-agrawal-ai Jan 4, 2023
69e6129
resource clubbing handling
kripanshdevtron Jan 4, 2023
b88ab1e
resource name fix for groups
kripanshdevtron Jan 4, 2023
0553699
group roles checked for namespace and cluster list api
vikramdevtron Jan 4, 2023
45e0933
added one more item star if has access to all namespaces
vikramdevtron Jan 5, 2023
6c893c6
refactoring
manish-agrawal-ai Jan 5, 2023
ce71772
manager auth RBAC handling
kripanshdevtron Jan 5, 2023
55ec8a7
Merge branch 'resource_browser' of https://github.com/devtron-labs/de…
kripanshdevtron Jan 5, 2023
30ae68b
multi resource validation handling
kripanshdevtron Jan 5, 2023
c4d29a8
all namespace data reverted
manish-agrawal-ai Jan 5, 2023
d80f7b6
RBAC in getApiResources API
manish-agrawal-ai Jan 5, 2023
a4f7ccd
RBAC fix in ApplyResource for namespace
manish-agrawal-ai Jan 5, 2023
5d2609c
bug fixes :
manish-agrawal-ai Jan 5, 2023
1574a1a
bug fixes :
manish-agrawal-ai Jan 6, 2023
456f6de
fix: all group with particular kind handling
manish-agrawal-ai Jan 6, 2023
094d3b8
Resource browser rbac (#2836)
kripanshdevtron Jan 6, 2023
c4dcff1
Revert "Resource browser rbac (#2836)" (#2838)
manish-agrawal-ai Jan 6, 2023
8d45568
Merge branch 'main' into resource_browser
manish-agrawal-ai Jan 6, 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
4 changes: 2 additions & 2 deletions api/apiToken/ApiTokenRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,8 +212,8 @@ func (impl ApiTokenRestHandlerImpl) DeleteApiToken(w http.ResponseWriter, r *htt
common.WriteJsonResp(w, err, res, http.StatusOK)
}

func (handler ApiTokenRestHandlerImpl) checkManagerAuth(token string, object string) bool {
if ok := handler.enforcer.Enforce(token, casbin.ResourceUser, casbin.ActionUpdate, strings.ToLower(object)); !ok {
func (handler ApiTokenRestHandlerImpl) checkManagerAuth(resource, token, object string) bool {
if ok := handler.enforcer.Enforce(token, resource, casbin.ActionUpdate, strings.ToLower(object)); !ok {
return false
}
return true
Expand Down
26 changes: 19 additions & 7 deletions api/bean/UserRequest.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ type RoleFilter struct {
Environment string `json:"environment"`
Action string `json:"action"`
AccessType string `json:"accessType"`

Cluster string `json:"cluster"`
Namespace string `json:"namespace"`
Group string `json:"group"`
Kind string `json:"kind"`
Resource string `json:"resource"`
}

type Role struct {
Expand All @@ -76,6 +82,12 @@ type RoleData struct {
Environment string `json:"environment"`
Action string `json:"action"`
AccessType string `json:"accessType"`

Cluster string `json:"cluster"`
Namespace string `json:"namespace"`
Group string `json:"group"`
Kind string `json:"kind"`
Resource string `json:"resource"`
}

type SSOLoginDto struct {
Expand All @@ -95,11 +107,11 @@ const (
type PolicyType int

const (
POLICY_DIRECT PolicyType = 1
POLICY_GROUP PolicyType = 1
POLICY_DIRECT PolicyType = 1
POLICY_GROUP PolicyType = 1
SUPERADMIN = "role:super-admin___"
APP_ACCESS_TYPE_HELM = "helm-app"
USER_TYPE_API_TOKEN = "apiToken"
CHART_GROUP_ENTITY = "chart-group"
CLUSTER_ENTITIY = "cluster"
)

const SUPERADMIN = "role:super-admin___"
const APP_ACCESS_TYPE_HELM = "helm-app"

const USER_TYPE_API_TOKEN = "apiToken"
61 changes: 61 additions & 0 deletions api/cluster/ClusterRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ type ClusterRestHandler interface {

FindAllForAutoComplete(w http.ResponseWriter, r *http.Request)
DeleteCluster(w http.ResponseWriter, r *http.Request)
GetClusterNamespaces(w http.ResponseWriter, r *http.Request)
GetAllClusterNamespaces(w http.ResponseWriter, r *http.Request)
FindAllForClusterPermission(w http.ResponseWriter, r *http.Request)
}

type ClusterRestHandlerImpl struct {
Expand Down Expand Up @@ -376,3 +378,62 @@ func (impl ClusterRestHandlerImpl) GetAllClusterNamespaces(w http.ResponseWriter

common.WriteJsonResp(w, nil, clusterNamespaces, http.StatusOK)
}

func (impl ClusterRestHandlerImpl) GetClusterNamespaces(w http.ResponseWriter, r *http.Request) {
//token := r.Header.Get("token")
vars := mux.Vars(r)
clusterIdString := vars["clusterId"]

userId, err := impl.userService.GetLoggedInUser(r)
if userId == 0 || err != nil {
impl.logger.Errorw("user not authorized", "error", err, "userId", userId)
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
token := r.Header.Get("token")
isActionUserSuperAdmin := false
if ok := impl.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); ok {
isActionUserSuperAdmin = true
}
clusterId, err := strconv.Atoi(clusterIdString)
if err != nil {
impl.logger.Errorw("failed to extract clusterId from param", "error", err, "clusterId", clusterIdString)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}

allClusterNamespaces, err := impl.clusterService.FindAllNamespacesByUserIdAndClusterId(userId, clusterId, isActionUserSuperAdmin)
if err != nil {
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
common.WriteJsonResp(w, nil, allClusterNamespaces, http.StatusOK)
}

func (impl ClusterRestHandlerImpl) FindAllForClusterPermission(w http.ResponseWriter, r *http.Request) {
userId, err := impl.userService.GetLoggedInUser(r)
if userId == 0 || err != nil {
impl.logger.Errorw("user not authorized", "error", err, "userId", userId)
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
token := r.Header.Get("token")
isActionUserSuperAdmin := false
if ok := impl.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); ok {
isActionUserSuperAdmin = true
}
clusterList, err := impl.clusterService.FindAllForClusterByUserId(userId, isActionUserSuperAdmin)
if err != nil {
impl.logger.Errorw("error in deleting cluster", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
// RBAC enforcer applying
// Already applied at service layer
//RBAC enforcer Ends

if len(clusterList) == 0 {
clusterList = make([]cluster.ClusterBean, 0)
}
common.WriteJsonResp(w, err, clusterList, http.StatusOK)
}
8 changes: 8 additions & 0 deletions api/cluster/ClusterRouter.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,19 @@ func (impl ClusterRouterImpl) InitClusterRouter(clusterRouter *mux.Router) {
Methods("GET").
HandlerFunc(impl.clusterRestHandler.FindAllForAutoComplete)

clusterRouter.Path("/namespaces/{clusterId}").
Methods("GET").
HandlerFunc(impl.clusterRestHandler.GetClusterNamespaces)

clusterRouter.Path("/namespaces").
Methods("GET").
HandlerFunc(impl.clusterRestHandler.GetAllClusterNamespaces)

clusterRouter.Path("").
Methods("DELETE").
HandlerFunc(impl.clusterRestHandler.DeleteCluster)

clusterRouter.Path("/auth-list").
Methods("GET").
HandlerFunc(impl.clusterRestHandler.FindAllForClusterPermission)
}
35 changes: 22 additions & 13 deletions api/user/UserRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,21 +64,24 @@ type userNamePassword struct {
}

type UserRestHandlerImpl struct {
userService user.UserService
validator *validator.Validate
logger *zap.SugaredLogger
enforcer casbin.Enforcer
roleGroupService user.RoleGroupService
userService user.UserService
validator *validator.Validate
logger *zap.SugaredLogger
enforcer casbin.Enforcer
roleGroupService user.RoleGroupService
userCommonService user.UserCommonService
}

func NewUserRestHandlerImpl(userService user.UserService, validator *validator.Validate,
logger *zap.SugaredLogger, enforcer casbin.Enforcer, roleGroupService user.RoleGroupService) *UserRestHandlerImpl {
logger *zap.SugaredLogger, enforcer casbin.Enforcer, roleGroupService user.RoleGroupService,
userCommonService user.UserCommonService) *UserRestHandlerImpl {
userAuthHandler := &UserRestHandlerImpl{
userService: userService,
validator: validator,
logger: logger,
enforcer: enforcer,
roleGroupService: roleGroupService,
userService: userService,
validator: validator,
logger: logger,
enforcer: enforcer,
roleGroupService: roleGroupService,
userCommonService: userCommonService,
}
return userAuthHandler
}
Expand Down Expand Up @@ -507,6 +510,12 @@ func (handler UserRestHandlerImpl) CreateRoleGroup(w http.ResponseWriter, r *htt
return
}
}
if filter.Entity == bean.CLUSTER_ENTITIY && !isActionUserSuperAdmin {
if isValidAuth := handler.userCommonService.CheckRbacForClusterEntity(filter.Cluster, filter.Namespace, filter.Group, filter.Kind, filter.Resource, token, handler.CheckManagerAuth); !isValidAuth {
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
return
}
}
}
} else {
if ok := handler.enforcer.Enforce(token, casbin.ResourceUser, casbin.ActionCreate, "*"); !ok {
Expand Down Expand Up @@ -881,8 +890,8 @@ func (handler UserRestHandlerImpl) InvalidateRoleCache(w http.ResponseWriter, r

}

func (handler UserRestHandlerImpl) CheckManagerAuth(token string, object string) bool {
if ok := handler.enforcer.Enforce(token, casbin.ResourceUser, casbin.ActionUpdate, strings.ToLower(object)); !ok {
func (handler UserRestHandlerImpl) CheckManagerAuth(resource, token string, object string) bool {
if ok := handler.enforcer.Enforce(token, resource, casbin.ActionUpdate, strings.ToLower(object)); !ok {
return false
}
return true
Expand Down
144 changes: 144 additions & 0 deletions client/k8s/application/Application.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,14 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/discovery"
"k8s.io/client-go/dynamic"
v1 "k8s.io/client-go/kubernetes/typed/core/v1"
"k8s.io/client-go/rest"
"k8s.io/utils/pointer"
"net/http"
"strings"
)

type K8sClientService interface {
Expand All @@ -25,6 +28,9 @@ type K8sClientService interface {
DeleteResource(restConfig *rest.Config, request *K8sRequestBean) (resp *ManifestResponse, err error)
ListEvents(restConfig *rest.Config, request *K8sRequestBean) (*EventsResponse, error)
GetPodLogs(restConfig *rest.Config, request *K8sRequestBean) (io.ReadCloser, error)
GetApiResources(restConfig *rest.Config, includeOnlyVerb string) ([]*K8sApiResource, error)
GetResourceList(restConfig *rest.Config, request *K8sRequestBean) (*ResourceListResponse, bool, error)
ApplyResource(restConfig *rest.Config, request *K8sRequestBean, manifest string) (*ManifestResponse, error)
}

type K8sClientServiceImpl struct {
Expand Down Expand Up @@ -66,6 +72,10 @@ type EventsResponse struct {
Events *apiv1.EventList `json:"events,omitempty"`
}

type ResourceListResponse struct {
Resources unstructured.UnstructuredList `json:"resources,omitempty"`
}

func (impl K8sClientServiceImpl) GetResource(restConfig *rest.Config, request *K8sRequestBean) (*ManifestResponse, error) {
resourceIf, namespaced, err := impl.GetResourceIf(restConfig, request)
if err != nil {
Expand Down Expand Up @@ -251,6 +261,36 @@ func (impl K8sClientServiceImpl) GetResourceIf(restConfig *rest.Config, request
return dynamicIf.Resource(resource), apiResource.Namespaced, nil
}

func (impl K8sClientServiceImpl) GetResourceIfWithAcceptHeader(restConfig *rest.Config, request *K8sRequestBean) (resourceIf dynamic.NamespaceableResourceInterface, namespaced bool, err error) {
resourceIdentifier := request.ResourceIdentifier
discoveryClient, err := discovery.NewDiscoveryClientForConfig(restConfig)
if err != nil {
impl.logger.Errorw("error in getting k8s client", "err", err)
return nil, false, err
}
apiResource, err := ServerResourceForGroupVersionKind(discoveryClient, resourceIdentifier.GroupVersionKind)
if err != nil {
impl.logger.Errorw("error in getting server resource", "err", err)
return nil, false, err
}
resource := resourceIdentifier.GroupVersionKind.GroupVersion().WithResource(apiResource.Name)
wt := restConfig.WrapTransport // Reference: https://github.com/kubernetes/client-go/issues/407
restConfig.WrapTransport = func(rt http.RoundTripper) http.RoundTripper {
if wt != nil {
rt = wt(rt)
}
return &HeaderAdder{
rt: rt,
}
}
dynamicIf, err := dynamic.NewForConfig(restConfig)
if err != nil {
impl.logger.Errorw("error in getting dynamic interface for resource", "err", err)
return nil, false, err
}
return dynamicIf.Resource(resource), apiResource.Namespaced, nil
}

func ServerResourceForGroupVersionKind(discoveryClient discovery.DiscoveryInterface, gvk schema.GroupVersionKind) (*metav1.APIResource, error) {
resources, err := discoveryClient.ServerResourcesForGroupVersion(gvk.GroupVersion().String())
if err != nil {
Expand All @@ -263,3 +303,107 @@ func ServerResourceForGroupVersionKind(discoveryClient discovery.DiscoveryInterf
}
return nil, errors.NewNotFound(schema.GroupResource{Group: gvk.Group, Resource: gvk.Kind}, "")
}

// if verb is supplied empty, that means - return all
func (impl K8sClientServiceImpl) GetApiResources(restConfig *rest.Config, includeOnlyVerb string) ([]*K8sApiResource, error) {
discoveryClient, err := discovery.NewDiscoveryClientForConfig(restConfig)
if err != nil {
impl.logger.Errorw("error in getting dynamic k8s client", "err", err)
return nil, err
}

apiResourcesListFromK8s, err := discoveryClient.ServerPreferredResources()
if err != nil {
impl.logger.Errorw("error in getting api-resources from k8s", "err", err)
return nil, err
}

var apiResources []*K8sApiResource
for _, apiResourceListFromK8s := range apiResourcesListFromK8s {
if apiResourceListFromK8s != nil {
for _, apiResourceFromK8s := range apiResourceListFromK8s.APIResources {
var includeResource bool
if len(includeOnlyVerb) > 0 {
for _, verb := range apiResourceFromK8s.Verbs {
if verb == includeOnlyVerb {
includeResource = true
break
}
}
} else {
includeResource = true
}
if !includeResource {
continue
}
var group string
var version string
gv := apiResourceListFromK8s.GroupVersion
if len(gv) > 0 {
splitGv := strings.Split(gv, "/")
if len(splitGv) == 1 {
version = splitGv[0]
} else {
group = splitGv[0]
version = splitGv[1]
}
}
apiResources = append(apiResources, &K8sApiResource{
Gvk: schema.GroupVersionKind{
Group: group,
Version: version,
Kind: apiResourceFromK8s.Kind,
},
Namespaced: apiResourceFromK8s.Namespaced,
})
}
}
}
return apiResources, nil
}

func (impl K8sClientServiceImpl) GetResourceList(restConfig *rest.Config, request *K8sRequestBean) (*ResourceListResponse, bool, error) {
resourceIf, namespaced, err := impl.GetResourceIfWithAcceptHeader(restConfig, request)
if err != nil {
impl.logger.Errorw("error in getting dynamic interface for resource", "err", err)
return nil, namespaced, err
}
resourceIdentifier := request.ResourceIdentifier
var resp *unstructured.UnstructuredList
listOptions := metav1.ListOptions{
TypeMeta: metav1.TypeMeta{
Kind: resourceIdentifier.GroupVersionKind.Kind,
APIVersion: resourceIdentifier.GroupVersionKind.GroupVersion().String(),
},
}
if len(resourceIdentifier.Namespace) > 0 && namespaced {
resp, err = resourceIf.Namespace(resourceIdentifier.Namespace).List(context.Background(), listOptions)
} else {
resp, err = resourceIf.List(context.Background(), listOptions)
}
if err != nil {
impl.logger.Errorw("error in getting resource", "err", err, "resource", resourceIdentifier)
return nil, namespaced, err
}
return &ResourceListResponse{*resp}, namespaced, nil
}

func (impl K8sClientServiceImpl) ApplyResource(restConfig *rest.Config, request *K8sRequestBean, manifest string) (*ManifestResponse, error) {
resourceIf, namespaced, err := impl.GetResourceIf(restConfig, request)
if err != nil {
impl.logger.Errorw("error in getting dynamic interface for resource", "err", err)
return nil, err
}
resourceIdentifier := request.ResourceIdentifier
var resp *unstructured.Unstructured
if len(resourceIdentifier.Namespace) > 0 && namespaced {
resp, err = resourceIf.Namespace(resourceIdentifier.Namespace).Patch(context.Background(), resourceIdentifier.Name, types.StrategicMergePatchType, []byte(manifest), metav1.PatchOptions{FieldManager: "patch"})
} else {
resp, err = resourceIf.Patch(context.Background(), resourceIdentifier.Name, types.StrategicMergePatchType, []byte(manifest), metav1.PatchOptions{FieldManager: "patch"})
}
if err != nil {
impl.logger.Errorw("error in applying resource", "err", err)
return nil, err
}
return &ManifestResponse{*resp}, nil
}
Loading