Skip to content

Commit

Permalink
corrected code including review suggested corrections
Browse files Browse the repository at this point in the history
Signed-off-by: IntaSlapna <inta.slapnja@inbox.lv>
  • Loading branch information
IntaSlapna committed Jul 26, 2023
1 parent 4e382d4 commit 2cac03f
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 178 deletions.
8 changes: 4 additions & 4 deletions apis/projects/v1alpha1/accesstoken_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ type AccessTokenParameters struct {
ProjectIDSelector *xpv1.Selector `json:"projectIdSelector,omitempty"`

// Expiration date of the access token. The date cannot be set later than the maximum allowable lifetime of an access token.
//If not set, the maximum allowable lifetime of a personal access token is 365 days.
// If not set, the maximum allowable lifetime of a personal access token is 365 days.
// Expected in ISO 8601 format (2019-03-15T08:00:00Z)
// +immutable
ExpiresAt *metav1.Time `json:"expiresAt,omitempty"`
Expand All @@ -58,9 +58,9 @@ type AccessTokenParameters struct {
// +immutable
Scopes []string `json:"scopes"`

//Name of the project access token
//+required
Name string `json:"name,required"`
// Name of the project access token
// +required
Name string `json:"name"`
}

// AccessTokenObservation represents a access token.
Expand Down
8 changes: 8 additions & 0 deletions apis/projects/v1alpha1/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,14 @@ var (
DeployTokenGroupVersionKind = SchemeGroupVersion.WithKind(DeployTokenKind)
)

// Deploy Token type metadata
var (
AccessTokenKind = reflect.TypeOf(DeployToken{}).Name()
AccessTokenGroupKind = schema.GroupKind{Group: Group, Kind: DeployTokenKind}.String()
AccessTokenKindAPIVersion = DeployTokenKind + "." + SchemeGroupVersion.String()
AccessTokenGroupVersionKind = SchemeGroupVersion.WithKind(DeployTokenKind)
)

// Variable type metadata
var (
VariableKind = reflect.TypeOf(Variable{}).Name()
Expand Down
80 changes: 0 additions & 80 deletions pkg/clients/projects/accesstoken_test.go

This file was deleted.

19 changes: 19 additions & 0 deletions pkg/clients/projects/fake/fake.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ type MockClient struct {
MockListVariables func(pid interface{}, opt *gitlab.ListProjectVariablesOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.ProjectVariable, *gitlab.Response, error)
MockRemoveVariable func(pid interface{}, key string, opt *gitlab.RemoveProjectVariableOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error)

MockGetAccessTokens func(pid interface{}, id int, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectAccessToken, *gitlab.Response, error)
MockCreateAccessToken func(pid interface{}, opt *gitlab.CreateProjectAccessTokenOptions, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectAccessToken, *gitlab.Response, error)
MockRevokeAccessToken func(pid interface{}, id int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error)

MockAddDeployKey func(pid interface{}, opt *gitlab.AddDeployKeyOptions, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectDeployKey, *gitlab.Response, error)
MockDeleteDeployKey func(pid interface{}, deployKey int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error)
MockUpdateDeployKey func(pid interface{}, deployKey int, opt *gitlab.UpdateDeployKeyOptions, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectDeployKey, *gitlab.Response, error)
Expand Down Expand Up @@ -183,3 +187,18 @@ func (c *MockClient) DeleteDeployKey(pid interface{}, deployKey int, options ...
func (c *MockClient) UpdateDeployKey(pid interface{}, deployKey int, opt *gitlab.UpdateDeployKeyOptions, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectDeployKey, *gitlab.Response, error) {
return c.MockUpdateDeployKey(pid, deployKey, opt)
}

// GetProjectAccessToken calls the underlying MockGetAccessTokens method.
func (c *MockClient) GetProjectAccessToken(pid interface{}, id int, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectAccessToken, *gitlab.Response, error) {
return c.MockGetAccessTokens(pid, id)
}

// CreateProjectAccessToken calls the underlying MockCreateProjectAccessToken method.
func (c *MockClient) CreateProjectAccessToken(pid interface{}, opt *gitlab.CreateProjectAccessTokenOptions, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectAccessToken, *gitlab.Response, error) {
return c.MockCreateAccessToken(pid, opt)
}

// RevokeProjectAccessToken calls the underlying MockDeleteProjectAccessToken method.
func (c *MockClient) RevokeProjectAccessToken(pid interface{}, id int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) {
return c.MockRevokeAccessToken(pid, id)
}
63 changes: 8 additions & 55 deletions pkg/controller/projects/accesstokens/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ package accesstokens
import (
"context"
"strconv"
"strings"
"time"

"github.com/xanzy/go-gitlab"
Expand All @@ -44,6 +43,7 @@ import (

const (
errNotAccessToken = "managed resource is not a Gitlab accesstoken custom resource"
errFailedParseID = "cannot parse Access Token ID to int"
errGetFailed = "cannot get Gitlab accesstoken"
errCreateFailed = "cannot create Gitlab accesstoken"
errDeleteFailed = "cannot delete Gitlab accesstoken"
Expand Down Expand Up @@ -99,24 +99,23 @@ func (e *external) Observe(ctx context.Context, mg resource.Managed) (managed.Ex
return managed.ExternalObservation{}, nil
}

AccessTokenID, err := strconv.Atoi(externalName)
accessTokenID, err := strconv.Atoi(externalName)
if err != nil {
return managed.ExternalObservation{}, errors.New(errNotAccessToken)
return managed.ExternalObservation{}, errors.Wrap(err, errFailedParseID)
}

if cr.Spec.ForProvider.ProjectID == nil {
return managed.ExternalObservation{}, errors.New(errMissingProjectID)
}

at, _, err := e.client.GetProjectAccessToken(*cr.Spec.ForProvider.ProjectID, AccessTokenID)
at, _, err := e.client.GetProjectAccessToken(*cr.Spec.ForProvider.ProjectID, accessTokenID)
if err != nil {
return managed.ExternalObservation{}, errors.Wrap(resource.Ignore(isErrorProjectAccessTokenNotFound, err), errGetFailed)
return managed.ExternalObservation{}, errors.Wrap(err, errProjecAccessTokentNotFound)
}

current := cr.Spec.ForProvider.DeepCopy()
lateInitializeProjectAccessToken(&cr.Spec.ForProvider, at)

cr.Status.AtProvider = v1alpha1.AccessTokenObservation{}
cr.Status.SetConditions(xpv1.Available())

return managed.ExternalObservation{
Expand All @@ -138,7 +137,7 @@ func (e *external) Create(ctx context.Context, mg resource.Managed) (managed.Ext

at, _, err := e.client.CreateProjectAccessToken(
*cr.Spec.ForProvider.ProjectID,
generateCreateProjectAccessTokenOptions(cr.Name, &cr.Spec.ForProvider),
projects.GenerateCreateProjectAccessTokenOptions(cr.Name, &cr.Spec.ForProvider),
gitlab.WithContext(ctx),
)

Expand Down Expand Up @@ -175,14 +174,13 @@ func (e *external) Delete(ctx context.Context, mg resource.Managed) error {
if cr.Spec.ForProvider.ProjectID == nil {
return errors.New(errMissingProjectID)
}

_, deleteError := e.client.RevokeProjectAccessToken(
_, err = e.client.RevokeProjectAccessToken(
*cr.Spec.ForProvider.ProjectID,
accessTokenID,
gitlab.WithContext(ctx),
)

return errors.Wrap(deleteError, errDeleteFailed)
return errors.Wrap(err, errDeleteFailed)
}

// lateInitializeProjectAccessToken fills the empty fields in the access token spec with the
Expand All @@ -200,48 +198,3 @@ func lateInitializeProjectAccessToken(in *v1alpha1.AccessTokenParameters, access
in.ExpiresAt = &metav1.Time{Time: time.Time(*accessToken.ExpiresAt)}
}
}

// findAccessToken try to find a access token with the ID in the access token array,
// if found return a access token otherwise return nil.
func findAccessToken(accessTokenID int, accessTokens []*gitlab.ProjectAccessToken) *gitlab.ProjectAccessToken {
for _, v := range accessTokens {
if v.ID == accessTokenID {
return v
}
}
return nil
}

//-- What was from interface file --//

// IsErrorProjectAccessTokenNotFound helper function to test for errProjectAccessTokenNotFound error.
func isErrorProjectAccessTokenNotFound(err error) bool {
if err == nil {
return false
}
return strings.Contains(err.Error(), errProjecAccessTokentNotFound)
}

// NewAccessTokenClient returns a new Gitlab ProjectAccessToken service
func newAccessTokenClient(cfg clients.Config) gitlab.ProjectAccessTokensService {
git := clients.NewClient(cfg)
return *git.ProjectAccessTokens
}

// GenerateCreateProjectAccessTokenOptions generates project creation options
func generateCreateProjectAccessTokenOptions(name string, p *v1alpha1.AccessTokenParameters) *gitlab.CreateProjectAccessTokenOptions {
accesstoken := &gitlab.CreateProjectAccessTokenOptions{
Name: &name,
Scopes: &p.Scopes,
}

if p.ExpiresAt != nil {
accesstoken.ExpiresAt = (*gitlab.ISOTime)(&p.ExpiresAt.Time)
}

if p.AccessLevel != nil {
accesstoken.AccessLevel = (*gitlab.AccessLevelValue)(p.AccessLevel)
}

return accesstoken
}
Loading

0 comments on commit 2cac03f

Please sign in to comment.