pkg/client/jenkins/roles.go (79 lines of code) (raw):
package jenkins
import (
"errors"
"fmt"
"strings"
"gopkg.in/resty.v1"
)
const (
crTypeKey = "type"
crRoleNameKey = "roleName"
)
type Role struct {
PermissionIDs map[string]bool `json:"permissionIds"`
Pattern string `json:"pattern"`
SIDs []string `json:"sids"`
}
var ErrNotFound = errors.New("role is not found")
func IsErrNotFound(err error) bool {
return errors.Is(err, ErrNotFound)
}
// AddRole add role to jenkins
// roleType - type of role, available options: globalRoles, projectRoles, nodeRoles.
func (jc JenkinsClient) AddRole(roleType, name, pattern string, permissions []string) error {
rsp, err := jc.resty.R().SetFormData(map[string]string{
crTypeKey: roleType,
crRoleNameKey: name,
"pattern": pattern,
"permissionIds": strings.Join(permissions, ","),
"overwrite": "false",
}).Post("/role-strategy/strategy/addRole")
return parseRestyResponse(rsp, err)
}
func (jc JenkinsClient) RemoveRoles(roleType string, roleNames []string) error {
rsp, err := jc.resty.R().SetFormData(map[string]string{
crTypeKey: roleType,
"roleNames": strings.Join(roleNames, ","),
}).Post("/role-strategy/strategy/removeRoles")
return parseRestyResponse(rsp, err)
}
func (jc JenkinsClient) AssignRole(roleType, roleName, subject string) error {
if _, err := jc.GetRole(roleType, roleName); err != nil {
return fmt.Errorf("failed to get role: %w", err)
}
rsp, err := jc.resty.R().SetFormData(map[string]string{
crTypeKey: roleType,
crRoleNameKey: roleName,
"sid": subject,
}).Post("/role-strategy/strategy/assignRole")
return parseRestyResponse(rsp, err)
}
func (jc JenkinsClient) UnAssignRole(roleType, roleName, subject string) error {
rsp, err := jc.resty.R().SetFormData(map[string]string{
crTypeKey: roleType,
crRoleNameKey: roleName,
"sid": subject,
}).Post("/role-strategy/strategy/unassignRole")
return parseRestyResponse(rsp, err)
}
func (jc JenkinsClient) GetRole(roleType, roleName string) (*Role, error) {
var r Role
rsp, err := jc.resty.R().SetFormData(map[string]string{
crTypeKey: roleType,
crRoleNameKey: roleName,
}).SetResult(&r).Post("/role-strategy/strategy/getRole")
if err = parseRestyResponse(rsp, err); err != nil {
return nil, fmt.Errorf("failed to get role: %w", err)
}
if rsp.String() == "{}" {
return nil, ErrNotFound
}
return &r, nil
}
func parseRestyResponse(rsp *resty.Response, err error) error {
if err != nil {
return fmt.Errorf("failed to perform post request: %w", err)
}
if rsp.IsError() {
return fmt.Errorf("failed to run request: status: %s, body: %s", rsp.Status(), rsp.String())
}
return nil
}