pkg/client/nexus/provider.go (95 lines of code) (raw):
package nexus
import (
"context"
"fmt"
"github.com/datadrivers/go-nexus-client/nexus3"
nexus3client "github.com/datadrivers/go-nexus-client/nexus3/pkg/client"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/epam/edp-nexus-operator/api/common"
nexusApi "github.com/epam/edp-nexus-operator/api/v1alpha1"
)
// ApiClientProvider is a struct for providing nexus api client.
type ApiClientProvider struct {
k8sClient client.Client
}
// NewApiClientProvider returns a new instance of ApiClientProvider.
func NewApiClientProvider(k8sClient client.Client) *ApiClientProvider {
return &ApiClientProvider{k8sClient: k8sClient}
}
// GetNexusApiClientFromNexus returns nexus api client from Nexus CR.
func (p *ApiClientProvider) GetNexusApiClientFromNexus(ctx context.Context, nexus *nexusApi.Nexus) (*nexus3.NexusClient, error) {
secret, err := p.getNexusSecret(ctx, nexus)
if err != nil {
return nil, err
}
return nexus3.NewClient(nexus3client.Config{
URL: nexus.Spec.Url,
Username: string(secret.Data["user"]),
Password: string(secret.Data["password"]),
}), nil
}
func (p *ApiClientProvider) GetNexusApiClientFromNexusRef(ctx context.Context, namespace string, ref common.HasNexusRef) (*nexus3.NexusClient, error) {
nexus := &nexusApi.Nexus{}
if err := p.k8sClient.Get(ctx, types.NamespacedName{
Name: ref.GetNexusRef().Name,
Namespace: namespace,
}, nexus); err != nil {
return nil, fmt.Errorf("failed to get nexus instance: %w", err)
}
return p.GetNexusApiClientFromNexus(ctx, nexus)
}
func (p *ApiClientProvider) GetNexusRepositoryClientFromNexusRef(ctx context.Context, namespace string, ref common.HasNexusRef) (*RepoClient, error) {
nexus := &nexusApi.Nexus{}
if err := p.k8sClient.Get(ctx, types.NamespacedName{
Name: ref.GetNexusRef().Name,
Namespace: namespace,
}, nexus); err != nil {
return nil, fmt.Errorf("failed to get nexus instance: %w", err)
}
secret, err := p.getNexusSecret(ctx, nexus)
if err != nil {
return nil, err
}
return NewRepoClient(ClientConfig{
BaseURL: nexus.Spec.Url,
UserName: string(secret.Data["user"]),
Password: string(secret.Data["password"]),
}), nil
}
func (p *ApiClientProvider) GetNexusNexusCleanupPolicyClientFromNexusRef(
ctx context.Context,
namespace string,
ref common.HasNexusRef,
) (*NexusCleanupPolicyClient, error) {
nexus := &nexusApi.Nexus{}
if err := p.k8sClient.Get(ctx, types.NamespacedName{
Name: ref.GetNexusRef().Name,
Namespace: namespace,
}, nexus); err != nil {
return nil, fmt.Errorf("failed to get nexus instance: %w", err)
}
secret, err := p.getNexusSecret(ctx, nexus)
if err != nil {
return nil, err
}
return NewNexusCleanupPolicyClient(ClientConfig{
BaseURL: nexus.Spec.Url,
UserName: string(secret.Data["user"]),
Password: string(secret.Data["password"]),
}), nil
}
func (p *ApiClientProvider) getNexusSecret(ctx context.Context, nexus *nexusApi.Nexus) (corev1.Secret, error) {
secret := corev1.Secret{}
if err := p.k8sClient.Get(ctx, types.NamespacedName{
Name: nexus.Spec.Secret,
Namespace: nexus.Namespace,
}, &secret); err != nil {
return corev1.Secret{}, fmt.Errorf("failed to get nexus secret: %w", err)
}
if secret.Data["user"] == nil {
return corev1.Secret{}, fmt.Errorf("nexus secret doesn't contain user")
}
if secret.Data["password"] == nil {
return corev1.Secret{}, fmt.Errorf("nexus secret doesn't contain password")
}
return secret, nil
}