7be93d9af4
* feat(provisioning): add /connections/{name}/repositories endpoint
Add a new subresource endpoint to list external repositories from git
providers (GitHub, GitLab, Bitbucket) accessible through a connection.
Changes:
- Add ExternalRepositoryList and ExternalRepository types with Name, Owner, and URL fields
- Create connection_repositories.go connector (returns 'not implemented' for now)
- Register storage and authorization for the repositories subresource
- Update OpenAPI documentation
- Regenerate code (deepcopy, openapi, client)
The endpoint is accessible at /apis/provisioning.grafana.app/v0alpha1/namespaces/{namespace}/connections/{name}/repositories
and requires admin read access.
Related: #TBD
* test(provisioning): add unit and integration tests for connection repositories endpoint
- Add unit tests for connection_repositories connector
- Add integration tests for authorization and endpoint behavior
- Tests verify not implemented response and proper authorization
* Fix generation
* fix(tests): fix test compilation and assertions
- Remove unused import in unit test
- Fix integration test Raw() usage
- Fix ExternalRepositoryList type verification test
* Format code
* fix(provisioning): fix ineffectual assignment in connection_repositories connector
- Add debug log statement to use logger variable
- Fixes linter error about ineffectual assignment to ctx
70 lines
2.4 KiB
Go
70 lines
2.4 KiB
Go
package provisioning
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/apiserver/pkg/registry/rest"
|
|
|
|
"github.com/grafana/grafana-app-sdk/logging"
|
|
provisioning "github.com/grafana/grafana/apps/provisioning/pkg/apis/provisioning/v0alpha1"
|
|
)
|
|
|
|
type connectionRepositoriesConnector struct{}
|
|
|
|
func NewConnectionRepositoriesConnector() *connectionRepositoriesConnector {
|
|
return &connectionRepositoriesConnector{}
|
|
}
|
|
|
|
func (*connectionRepositoriesConnector) New() runtime.Object {
|
|
return &provisioning.ExternalRepositoryList{}
|
|
}
|
|
|
|
func (*connectionRepositoriesConnector) Destroy() {}
|
|
|
|
func (*connectionRepositoriesConnector) ProducesMIMETypes(verb string) []string {
|
|
return []string{"application/json"}
|
|
}
|
|
|
|
func (*connectionRepositoriesConnector) ProducesObject(verb string) any {
|
|
return &provisioning.ExternalRepositoryList{}
|
|
}
|
|
|
|
func (*connectionRepositoriesConnector) ConnectMethods() []string {
|
|
return []string{http.MethodGet}
|
|
}
|
|
|
|
func (*connectionRepositoriesConnector) NewConnectOptions() (runtime.Object, bool, string) {
|
|
return nil, false, ""
|
|
}
|
|
|
|
func (c *connectionRepositoriesConnector) Connect(ctx context.Context, name string, opts runtime.Object, responder rest.Responder) (http.Handler, error) {
|
|
logger := logging.FromContext(ctx).With("logger", "connection-repositories-connector", "connection_name", name)
|
|
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodGet {
|
|
responder.Error(apierrors.NewMethodNotSupported(provisioning.ConnectionResourceInfo.GroupResource(), r.Method))
|
|
return
|
|
}
|
|
|
|
logger.Debug("repositories endpoint called but not yet implemented")
|
|
|
|
// TODO: Implement repository listing from external git provider
|
|
// This will require:
|
|
// 1. Get the Connection object using logging.Context(r.Context(), logger)
|
|
// 2. Use the connection credentials to authenticate with the git provider
|
|
// 3. List repositories from the provider (GitHub, GitLab, Bitbucket)
|
|
// 4. Return ExternalRepositoryList with Name, Owner, and URL for each repository
|
|
|
|
responder.Error(apierrors.NewMethodNotSupported(provisioning.ConnectionResourceInfo.GroupResource(), "repositories endpoint not yet implemented"))
|
|
}), nil
|
|
}
|
|
|
|
var (
|
|
_ rest.Storage = (*connectionRepositoriesConnector)(nil)
|
|
_ rest.Connecter = (*connectionRepositoriesConnector)(nil)
|
|
_ rest.StorageMetadata = (*connectionRepositoriesConnector)(nil)
|
|
)
|