Skip to content

Commit

Permalink
feat: gitlab self managed support (#170)
Browse files Browse the repository at this point in the history
  • Loading branch information
idagelic authored Mar 11, 2024
1 parent a2ceb87 commit be12a70
Show file tree
Hide file tree
Showing 18 changed files with 164 additions and 158 deletions.
3 changes: 3 additions & 0 deletions cmd/daytona/config/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func GetGitProviderList() []GitProvider {
return []GitProvider{
{"github", "GitHub", ""},
{"gitlab", "GitLab", ""},
{"gitlab-self-managed", "GitLab Self-managed", ""},
{"bitbucket", "Bitbucket", ""},
}
}
Expand All @@ -36,6 +37,8 @@ func GetDocsLinkFromGitProvider(providerId string) string {
case "github":
return "https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic"
case "gitlab":
fallthrough
case "gitlab-self-managed":
return "https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token"
case "bitbucket":
return "https://support.atlassian.com/bitbucket-cloud/docs/create-an-app-password"
Expand Down
15 changes: 0 additions & 15 deletions internal/util/workspace.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,21 +84,6 @@ func GetValidatedUrl(input string) (string, error) {
return "", fmt.Errorf("input is not a valid URL")
}

// Validate the URL's host (domain) has a proper extension
host := parsedURL.Host
if !isValidTLD(host) {
return "", fmt.Errorf("the URL does not have a valid TLD")
}

// If parsing was successful, return the fixed URL
return parsedURL.String(), nil
}

func isValidTLD(host string) bool {
// Regular expression to match common domain extensions like .com, .org, etc.
extensionPattern := `\.([a-zA-Z]{2,6})$`
regex := regexp.MustCompile(extensionPattern)

// Check if the host (domain) matches the extension pattern
return regex.MatchString(host)
}
49 changes: 26 additions & 23 deletions pkg/cmd/git_cred.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,21 +50,9 @@ var gitCredCmd = &cobra.Command{
log.Fatal(apiclient.HandleErrorResponse(res, err))
}

gitProviderId := getGitProviderIdFromHost(host)
if gitProviderId == "" {
fmt.Println("error: unable to determine git provider")
return
}
gitProvider := getGitProviderFromHost(host, serverConfig.GitProviders)

var gitProvider *serverapiclient.GitProvider
for _, provider := range serverConfig.GitProviders {
if *provider.Id == gitProviderId {
gitProvider = &provider
break
}
}

if gitProvider == nil {
if gitProvider == (serverapiclient.GitProvider{}) {
fmt.Println("error: git provider not found")
os.Exit(1)
return
Expand All @@ -80,16 +68,31 @@ var gitCredCmd = &cobra.Command{
},
}

func getGitProviderIdFromHost(url string) string {
if strings.Contains(url, "github.com") {
return "github"
} else if strings.Contains(url, "gitlab.com") {
return "gitlab"
} else if strings.Contains(url, "bitbucket.org") {
return "bitbucket"
} else {
return ""
func getGitProviderFromHost(url string, gitProviders []serverapiclient.GitProvider) serverapiclient.GitProvider {
for _, gitProvider := range gitProviders {
if strings.Contains(url, fmt.Sprintf("%s.", *gitProvider.Id)) {
return gitProvider
}

if *gitProvider.BaseApiUrl != "" && strings.Contains(url, getHostnameFromUrl(*gitProvider.BaseApiUrl)) {
return gitProvider
}
}
return serverapiclient.GitProvider{}
}

func getHostnameFromUrl(url string) string {
input := url
input = strings.TrimPrefix(input, "https://")
input = strings.TrimPrefix(input, "http://")
input = strings.TrimPrefix(input, "www.")

// Remove everything after the first '/'
if slashIndex := strings.Index(input, "/"); slashIndex != -1 {
input = input[:slashIndex]
}

return input
}

func parseFromStdin() (map[string]string, error) {
Expand Down
10 changes: 6 additions & 4 deletions pkg/cmd/gitprovider/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ var gitProviderAddCmd = &cobra.Command{
}

if gitProviderSelectView.Username == "" {
gitUsername, err := gitprovider.GetUsernameFromToken(gitProviderSelectView.Id, config.GetGitProviderList(), gitProviderSelectView.Token)
gitUsername, err := gitprovider.GetUsernameFromToken(gitProviderSelectView.Id, config.GetGitProviderList(), gitProviderSelectView.Token, gitProviderSelectView.BaseApiUrl)
if err != nil {
log.Fatal(err)
}
Expand All @@ -64,16 +64,18 @@ var gitProviderAddCmd = &cobra.Command{
for _, gitProvider := range gitProviderList {
if *gitProvider.Id == gitProviderSelectView.Id {
*gitProvider.Username = gitProviderSelectView.Username
*gitProvider.BaseApiUrl = gitProviderSelectView.BaseApiUrl
*gitProvider.Token = gitProviderSelectView.Token
providerExists = true
}
}

if !providerExists {
gitProviderList = append(serverConfig.GitProviders, serverapiclient.GitProvider{
Id: &gitProviderSelectView.Id,
Username: &gitProviderSelectView.Username,
Token: &gitProviderSelectView.Token,
Id: &gitProviderSelectView.Id,
Username: &gitProviderSelectView.Username,
BaseApiUrl: &gitProviderSelectView.BaseApiUrl,
Token: &gitProviderSelectView.Token,
})
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/cmd/gitprovider/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (

var gitProviderDeleteCmd = &cobra.Command{
Use: "delete",
Aliases: []string{"remove"},
Aliases: []string{"remove", "rm"},
Short: "Unregister a Git providers",
Run: func(cmd *cobra.Command, args []string) {
apiClient, err := server.GetApiClient(nil)
Expand Down
3 changes: 3 additions & 0 deletions pkg/cmd/workspace/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,9 @@ func processPrompting(cmd *cobra.Command, apiClient *serverapiclient.APIClient,
if serverGitProvider.Token != nil {
gitProvider.Token = *serverGitProvider.Token
}
if serverGitProvider.BaseApiUrl != nil {
gitProvider.BaseApiUrl = *serverGitProvider.BaseApiUrl
}
gitProviderList = append(gitProviderList, gitProvider)
}

Expand Down
12 changes: 10 additions & 2 deletions pkg/gitprovider/git_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,17 @@ func GetGitProvider(providerId string, gitProviders []types.GitProvider) GitProv
username: chosenProvider.Username,
token: chosenProvider.Token,
}
case "gitlab-self-managed":
return &GitLabGitProvider{
token: chosenProvider.Token,
baseApiUrl: chosenProvider.BaseApiUrl,
}
default:
return nil
}
}

func GetUsernameFromToken(providerId string, gitProviders []config.GitProvider, token string) (string, error) {
func GetUsernameFromToken(providerId string, gitProviders []config.GitProvider, token string, baseApiUrl string) (string, error) {
var gitProvider GitProvider

switch providerId {
Expand All @@ -95,8 +100,11 @@ func GetUsernameFromToken(providerId string, gitProviders []config.GitProvider,
token: token,
}
case "gitlab":
fallthrough
case "gitlab-self-managed":
gitProvider = &GitLabGitProvider{
token: token,
token: token,
baseApiUrl: baseApiUrl,
}
case "bitbucket":
gitProvider = &BitbucketGitProvider{
Expand Down
12 changes: 10 additions & 2 deletions pkg/gitprovider/gitlab.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import (
)

type GitLabGitProvider struct {
token string
token string
baseApiUrl string
}

func (g *GitLabGitProvider) GetNamespaces() ([]GitNamespace, error) {
Expand Down Expand Up @@ -144,7 +145,14 @@ func (g *GitLabGitProvider) GetUserData() (GitUser, error) {
}

func (g *GitLabGitProvider) getApiClient() *gitlab.Client {
client, err := gitlab.NewClient(g.token)
var client *gitlab.Client
var err error

if g.baseApiUrl == "" {
client, err = gitlab.NewClient(g.token)
} else {
client, err = gitlab.NewClient(g.token, gitlab.WithBaseURL(g.baseApiUrl))
}
if err != nil {
log.Fatal(err)
}
Expand Down
6 changes: 3 additions & 3 deletions pkg/server/api/docs/docs.go
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,9 @@ const docTemplate = `{
"GitProvider": {
"type": "object",
"properties": {
"baseApiUrl": {
"type": "string"
},
"id": {
"type": "string"
},
Expand Down Expand Up @@ -587,9 +590,6 @@ const docTemplate = `{
"Project": {
"type": "object",
"properties": {
"info": {
"$ref": "#/definitions/ProjectInfo"
},
"name": {
"type": "string"
},
Expand Down
6 changes: 3 additions & 3 deletions pkg/server/api/docs/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,9 @@
"GitProvider": {
"type": "object",
"properties": {
"baseApiUrl": {
"type": "string"
},
"id": {
"type": "string"
},
Expand Down Expand Up @@ -584,9 +587,6 @@
"Project": {
"type": "object",
"properties": {
"info": {
"$ref": "#/definitions/ProjectInfo"
},
"name": {
"type": "string"
},
Expand Down
4 changes: 2 additions & 2 deletions pkg/server/api/docs/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ definitions:
type: object
GitProvider:
properties:
baseApiUrl:
type: string
id:
type: string
token:
Expand All @@ -45,8 +47,6 @@ definitions:
type: object
Project:
properties:
info:
$ref: '#/definitions/ProjectInfo'
name:
type: string
repository:
Expand Down
35 changes: 7 additions & 28 deletions pkg/serverapiclient/api/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -412,10 +412,13 @@ components:
type: object
GitProvider:
example:
baseApiUrl: baseApiUrl
id: id
token: token
username: username
properties:
baseApiUrl:
type: string
id:
type: string
token:
Expand Down Expand Up @@ -456,19 +459,9 @@ components:
branch: branch
sha: sha
url: url
info:
providerMetadata: providerMetadata
isRunning: true
created: created
name: name
finished: finished
started: started
workspaceId: workspaceId
target: target
workspaceId: workspaceId
properties:
info:
$ref: '#/components/schemas/ProjectInfo'
name:
type: string
repository:
Expand Down Expand Up @@ -574,10 +567,12 @@ components:
id: id
targetsFilePath: targetsFilePath
gitProviders:
- id: id
- baseApiUrl: baseApiUrl
id: id
token: token
username: username
- id: id
- baseApiUrl: baseApiUrl
id: id
token: token
username: username
frps:
Expand Down Expand Up @@ -620,14 +615,6 @@ components:
branch: branch
sha: sha
url: url
info:
providerMetadata: providerMetadata
isRunning: true
created: created
name: name
finished: finished
started: started
workspaceId: workspaceId
target: target
workspaceId: workspaceId
- name: name
Expand All @@ -641,14 +628,6 @@ components:
branch: branch
sha: sha
url: url
info:
providerMetadata: providerMetadata
isRunning: true
created: created
name: name
finished: finished
started: started
workspaceId: workspaceId
target: target
workspaceId: workspaceId
name: name
Expand Down
26 changes: 26 additions & 0 deletions pkg/serverapiclient/docs/GitProvider.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**BaseApiUrl** | Pointer to **string** | | [optional]
**Id** | Pointer to **string** | | [optional]
**Token** | Pointer to **string** | | [optional]
**Username** | Pointer to **string** | | [optional]
Expand All @@ -27,6 +28,31 @@ NewGitProviderWithDefaults instantiates a new GitProvider object
This constructor will only assign default values to properties that have it defined,
but it doesn't guarantee that properties required by API are set

### GetBaseApiUrl

`func (o *GitProvider) GetBaseApiUrl() string`

GetBaseApiUrl returns the BaseApiUrl field if non-nil, zero value otherwise.

### GetBaseApiUrlOk

`func (o *GitProvider) GetBaseApiUrlOk() (*string, bool)`

GetBaseApiUrlOk returns a tuple with the BaseApiUrl field if it's non-nil, zero value otherwise
and a boolean to check if the value has been set.

### SetBaseApiUrl

`func (o *GitProvider) SetBaseApiUrl(v string)`

SetBaseApiUrl sets BaseApiUrl field to given value.

### HasBaseApiUrl

`func (o *GitProvider) HasBaseApiUrl() bool`

HasBaseApiUrl returns a boolean if a field has been set.

### GetId

`func (o *GitProvider) GetId() string`
Expand Down
Loading

0 comments on commit be12a70

Please sign in to comment.