harness-drone/plugin/config/global.go
2022-03-16 09:37:25 -07:00

136 lines
3.2 KiB
Go

// Copyright 2019 Drone.IO Inc. All rights reserved.
// Use of this source code is governed by the Drone Non-Commercial License
// that can be found in the LICENSE file.
//go:build !oss
// +build !oss
package config
import (
"context"
"time"
"github.com/drone/drone-go/drone"
"github.com/drone/drone-go/plugin/config"
"github.com/drone/drone/core"
)
// Global returns a configuration service that fetches the yaml
// configuration from a remote endpoint.
func Global(endpoint, signer string, skipVerify bool, timeout time.Duration) core.ConfigService {
if endpoint == "" {
return new(global)
}
return &global{
client: config.Client(
endpoint,
signer,
skipVerify,
),
timeout: timeout,
}
}
type global struct {
client config.Plugin
timeout time.Duration
}
func (g *global) Find(ctx context.Context, in *core.ConfigArgs) (*core.Config, error) {
if g.client == nil {
return nil, nil
}
// include a timeout to prevent an API call from
// hanging the build process indefinitely. The
// external service must return a response within
// the configured timeout (default 1m).
ctx, cancel := context.WithTimeout(ctx, g.timeout)
defer cancel()
req := &config.Request{
Repo: toRepo(in.Repo),
Build: toBuild(in.Build),
Token: drone.Token{
Access: in.User.Token,
Refresh: in.User.Refresh,
},
}
res, err := g.client.Find(ctx, req)
if err != nil {
return nil, err
}
// if no error is returned and the secret is empty,
// this indicates the client returned No Content,
// and we should exit with no secret, but no error.
if res.Data == "" {
return nil, nil
}
return &core.Config{
Kind: res.Kind,
Data: res.Data,
}, nil
}
func toRepo(from *core.Repository) drone.Repo {
return drone.Repo{
ID: from.ID,
UID: from.UID,
UserID: from.UserID,
Namespace: from.Namespace,
Name: from.Name,
Slug: from.Slug,
SCM: from.SCM,
HTTPURL: from.HTTPURL,
SSHURL: from.SSHURL,
Link: from.Link,
Branch: from.Branch,
Private: from.Private,
Visibility: from.Visibility,
Active: from.Active,
Config: from.Config,
Trusted: from.Trusted,
Protected: from.Protected,
Timeout: from.Timeout,
}
}
func toBuild(from *core.Build) drone.Build {
return drone.Build{
ID: from.ID,
RepoID: from.RepoID,
Trigger: from.Trigger,
Number: from.Number,
Parent: from.Parent,
Status: from.Status,
Error: from.Error,
Event: from.Event,
Action: from.Action,
Link: from.Link,
Timestamp: from.Timestamp,
Title: from.Title,
Message: from.Message,
Before: from.Before,
After: from.After,
Ref: from.Ref,
Fork: from.Fork,
Source: from.Source,
Target: from.Target,
Author: from.Author,
AuthorName: from.AuthorName,
AuthorEmail: from.AuthorEmail,
AuthorAvatar: from.AuthorAvatar,
Sender: from.Sender,
Params: from.Params,
Deploy: from.Deploy,
Started: from.Started,
Finished: from.Finished,
Created: from.Created,
Updated: from.Updated,
Version: from.Version,
}
}