Compare commits

...

8 Commits

Author SHA1 Message Date
Sven Dowideit
dc0d692d99 don't make factories and interfaces when there's only one
Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io>
2022-02-23 17:37:27 +10:00
Sven Dowideit
e0a5fa5972 move snapshotter service under orchestrators
Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io>
2022-02-23 17:14:39 +10:00
Sven Dowideit
a22fff9c57 move docker and kube code under the one subdir
Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io>
2022-02-23 16:55:28 +10:00
Sven Dowideit
beb1299213 move edgeschedule struct declaration to its dataservice, which then shows that its not just deprecated, its totally unused REMOVEIT!
Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io>
2022-02-23 16:49:58 +10:00
Sven Dowideit
ea0b34de72 move registry struct definitions to dataservice/registry
Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io>
2022-02-23 16:21:35 +10:00
Sven Dowideit
1598ec47ff move Connection interface to api/database, and edgejob type definitions to api/dataservices/edgejobs to reduce the number of deps on portainer., and make deps on specific structures more obvious
Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io>
2022-02-23 15:57:06 +10:00
Sven Dowideit
cdef48eb8e move the DockerHub struct to its dataservice, and then notice - this isn't use anymore?
Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io>
2022-02-23 15:32:15 +10:00
Sven Dowideit
a90f1aa60d move the entrypoint object defaults to the entrypoint lifecycle module, so its reusable. This can then also be leveraged for migration and import.
Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io>
2022-02-23 15:04:17 +10:00
238 changed files with 1463 additions and 1334 deletions

View File

@@ -2,6 +2,7 @@ package apikey
import (
"crypto/rand"
"github.com/portainer/portainer/api/database"
"io"
portainer "github.com/portainer/portainer/api"
@@ -12,11 +13,11 @@ type APIKeyService interface {
HashRaw(rawKey string) []byte
GenerateApiKey(user portainer.User, description string) (string, *portainer.APIKey, error)
GetAPIKey(apiKeyID portainer.APIKeyID) (*portainer.APIKey, error)
GetAPIKeys(userID portainer.UserID) ([]portainer.APIKey, error)
GetAPIKeys(userID database.UserID) ([]portainer.APIKey, error)
GetDigestUserAndKey(digest []byte) (portainer.User, portainer.APIKey, error)
UpdateAPIKey(apiKey *portainer.APIKey) error
DeleteAPIKey(apiKeyID portainer.APIKeyID) error
InvalidateUserKeyCache(userId portainer.UserID) bool
InvalidateUserKeyCache(userId database.UserID) bool
}
// generateRandomKey generates a random key of specified length

View File

@@ -3,6 +3,7 @@ package apikey
import (
lru "github.com/hashicorp/golang-lru"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
)
const defaultAPIKeyCacheSize = 1024
@@ -57,7 +58,7 @@ func (c *apiKeyCache) Delete(digest []byte) {
}
// InvalidateUserKeyCache loops through all the api-keys associated to a user and removes them from the cache
func (c *apiKeyCache) InvalidateUserKeyCache(userId portainer.UserID) bool {
func (c *apiKeyCache) InvalidateUserKeyCache(userId database.UserID) bool {
present := false
for _, k := range c.cache.Keys() {
user, _, _ := c.Get([]byte(k.(string)))

View File

@@ -4,6 +4,7 @@ import (
"crypto/sha256"
"encoding/base64"
"fmt"
"github.com/portainer/portainer/api/database"
"time"
"github.com/pkg/errors"
@@ -70,7 +71,7 @@ func (a *apiKeyService) GetAPIKey(apiKeyID portainer.APIKeyID) (*portainer.APIKe
}
// GetAPIKeys returns all the API keys associated to a user.
func (a *apiKeyService) GetAPIKeys(userID portainer.UserID) ([]portainer.APIKey, error) {
func (a *apiKeyService) GetAPIKeys(userID database.UserID) ([]portainer.APIKey, error) {
return a.apiKeyRepository.GetAPIKeysByUserID(userID)
}
@@ -122,6 +123,6 @@ func (a *apiKeyService) DeleteAPIKey(apiKeyID portainer.APIKeyID) error {
return a.apiKeyRepository.DeleteAPIKey(apiKeyID)
}
func (a *apiKeyService) InvalidateUserKeyCache(userId portainer.UserID) bool {
func (a *apiKeyService) InvalidateUserKeyCache(userId database.UserID) bool {
return a.cache.InvalidateUserKeyCache(userId)
}

View File

@@ -1,13 +1,15 @@
package chisel
import (
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/edgejob"
"strconv"
portainer "github.com/portainer/portainer/api"
)
// AddEdgeJob register an EdgeJob inside the tunnel details associated to an environment(endpoint).
func (service *Service) AddEdgeJob(endpointID portainer.EndpointID, edgeJob *portainer.EdgeJob) {
func (service *Service) AddEdgeJob(endpointID database.EndpointID, edgeJob *edgejob.EdgeJob) {
tunnel := service.GetTunnelDetails(endpointID)
existingJobIndex := -1
@@ -29,11 +31,11 @@ func (service *Service) AddEdgeJob(endpointID portainer.EndpointID, edgeJob *por
}
// RemoveEdgeJob will remove the specified Edge job from each tunnel it was registered with.
func (service *Service) RemoveEdgeJob(edgeJobID portainer.EdgeJobID) {
func (service *Service) RemoveEdgeJob(edgeJobID edgejob.EdgeJobID) {
for item := range service.tunnelDetailsMap.IterBuffered() {
tunnelDetails := item.Val.(*portainer.TunnelDetails)
updatedJobs := make([]portainer.EdgeJob, 0)
updatedJobs := make([]edgejob.EdgeJob, 0)
for _, edgeJob := range tunnelDetails.Jobs {
if edgeJob.ID == edgeJobID {
continue

View File

@@ -3,6 +3,7 @@ package chisel
import (
"context"
"fmt"
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/http/proxy"
"log"
"net/http"
@@ -46,7 +47,7 @@ func NewService(dataStore dataservices.DataStore, shutdownCtx context.Context) *
}
// pingAgent ping the given agent so that the agent can keep the tunnel alive
func (service *Service) pingAgent(endpointID portainer.EndpointID) error {
func (service *Service) pingAgent(endpointID database.EndpointID) error {
tunnel := service.GetTunnelDetails(endpointID)
requestURL := fmt.Sprintf("http://127.0.0.1:%d/ping", tunnel.Port)
req, err := http.NewRequest(http.MethodHead, requestURL, nil)
@@ -66,7 +67,7 @@ func (service *Service) pingAgent(endpointID portainer.EndpointID) error {
}
// KeepTunnelAlive keeps the tunnel of the given environment for maxAlive duration, or until ctx is done
func (service *Service) KeepTunnelAlive(endpointID portainer.EndpointID, ctx context.Context, maxAlive time.Duration) {
func (service *Service) KeepTunnelAlive(endpointID database.EndpointID, ctx context.Context, maxAlive time.Duration) {
go func() {
log.Printf("[DEBUG] [chisel,KeepTunnelAlive] [endpoint_id: %d] [message: start for %.0f minutes]\n", endpointID, maxAlive.Minutes())
maxAliveTicker := time.NewTicker(maxAlive)
@@ -211,7 +212,7 @@ func (service *Service) checkTunnels() {
log.Printf("[ERROR] [chisel,snapshot,conversion] Invalid environment identifier (id: %s): %s", item.Key, err)
}
err = service.snapshotEnvironment(portainer.EndpointID(endpointID), tunnel.Port)
err = service.snapshotEnvironment(database.EndpointID(endpointID), tunnel.Port)
if err != nil {
log.Printf("[ERROR] [snapshot] Unable to snapshot Edge environment (id: %s): %s", item.Key, err)
}
@@ -223,11 +224,11 @@ func (service *Service) checkTunnels() {
continue
}
service.SetTunnelStatusToIdle(portainer.EndpointID(endpointID))
service.SetTunnelStatusToIdle(database.EndpointID(endpointID))
}
}
func (service *Service) snapshotEnvironment(endpointID portainer.EndpointID, tunnelPort int) error {
func (service *Service) snapshotEnvironment(endpointID database.EndpointID, tunnelPort int) error {
endpoint, err := service.dataStore.Endpoint().Endpoint(endpointID)
if err != nil {
return err

View File

@@ -3,6 +3,8 @@ package chisel
import (
"encoding/base64"
"fmt"
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/edgejob"
"math/rand"
"strconv"
"strings"
@@ -39,7 +41,7 @@ func randomInt(min, max int) int {
}
// GetTunnelDetails returns information about the tunnel associated to an environment(endpoint).
func (service *Service) GetTunnelDetails(endpointID portainer.EndpointID) *portainer.TunnelDetails {
func (service *Service) GetTunnelDetails(endpointID database.EndpointID) *portainer.TunnelDetails {
key := strconv.Itoa(int(endpointID))
if item, ok := service.tunnelDetailsMap.Get(key); ok {
@@ -47,7 +49,7 @@ func (service *Service) GetTunnelDetails(endpointID portainer.EndpointID) *porta
return tunnelDetails
}
jobs := make([]portainer.EdgeJob, 0)
jobs := make([]edgejob.EdgeJob, 0)
return &portainer.TunnelDetails{
Status: portainer.EdgeAgentIdle,
Port: 0,
@@ -90,7 +92,7 @@ func (service *Service) GetActiveTunnel(endpoint *portainer.Endpoint) (*portaine
// SetTunnelStatusToActive update the status of the tunnel associated to the specified environment(endpoint).
// It sets the status to ACTIVE.
func (service *Service) SetTunnelStatusToActive(endpointID portainer.EndpointID) {
func (service *Service) SetTunnelStatusToActive(endpointID database.EndpointID) {
tunnel := service.GetTunnelDetails(endpointID)
tunnel.Status = portainer.EdgeAgentActive
tunnel.Credentials = ""
@@ -103,7 +105,7 @@ func (service *Service) SetTunnelStatusToActive(endpointID portainer.EndpointID)
// SetTunnelStatusToIdle update the status of the tunnel associated to the specified environment(endpoint).
// It sets the status to IDLE.
// It removes any existing credentials associated to the tunnel.
func (service *Service) SetTunnelStatusToIdle(endpointID portainer.EndpointID) {
func (service *Service) SetTunnelStatusToIdle(endpointID database.EndpointID) {
tunnel := service.GetTunnelDetails(endpointID)
tunnel.Status = portainer.EdgeAgentIdle
@@ -127,7 +129,7 @@ func (service *Service) SetTunnelStatusToIdle(endpointID portainer.EndpointID) {
// If no port is currently associated to the tunnel, it will associate a random unused port to the tunnel
// and generate temporary credentials that can be used to establish a reverse tunnel on that port.
// Credentials are encrypted using the Edge ID associated to the environment(endpoint).
func (service *Service) SetTunnelStatusToRequired(endpointID portainer.EndpointID) error {
func (service *Service) SetTunnelStatusToRequired(endpointID database.EndpointID) error {
tunnel := service.GetTunnelDetails(endpointID)
if tunnel.Port == 0 {

View File

@@ -4,6 +4,10 @@ import (
"context"
"crypto/sha256"
"fmt"
docker2 "github.com/portainer/portainer/api/orchestrators/docker"
kubernetes2 "github.com/portainer/portainer/api/orchestrators/kubernetes"
kubecli "github.com/portainer/portainer/api/orchestrators/kubernetes/cli"
"github.com/portainer/portainer/api/orchestrators/snapshot"
"log"
"os"
"path"
@@ -23,7 +27,6 @@ import (
"github.com/portainer/portainer/api/database/boltdb"
"github.com/portainer/portainer/api/dataservices"
"github.com/portainer/portainer/api/datastore"
"github.com/portainer/portainer/api/docker"
"github.com/portainer/portainer/api/exec"
"github.com/portainer/portainer/api/filesystem"
"github.com/portainer/portainer/api/git"
@@ -34,11 +37,8 @@ import (
kubeproxy "github.com/portainer/portainer/api/http/proxy/factory/kubernetes"
"github.com/portainer/portainer/api/internal/authorization"
"github.com/portainer/portainer/api/internal/edge"
"github.com/portainer/portainer/api/internal/snapshot"
"github.com/portainer/portainer/api/internal/ssl"
"github.com/portainer/portainer/api/jwt"
"github.com/portainer/portainer/api/kubernetes"
kubecli "github.com/portainer/portainer/api/kubernetes/cli"
"github.com/portainer/portainer/api/ldap"
"github.com/portainer/portainer/api/oauth"
"github.com/portainer/portainer/api/scheduler"
@@ -225,19 +225,16 @@ func initSSLService(addr, dataPath, certPath, keyPath string, fileService portai
return sslService, nil
}
func initDockerClientFactory(signatureService portainer.DigitalSignatureService, reverseTunnelService portainer.ReverseTunnelService) *docker.ClientFactory {
return docker.NewClientFactory(signatureService, reverseTunnelService)
func initDockerClientFactory(signatureService portainer.DigitalSignatureService, reverseTunnelService portainer.ReverseTunnelService) *docker2.ClientFactory {
return docker2.NewClientFactory(signatureService, reverseTunnelService)
}
func initKubernetesClientFactory(signatureService portainer.DigitalSignatureService, reverseTunnelService portainer.ReverseTunnelService, instanceID string, dataStore dataservices.DataStore) *kubecli.ClientFactory {
return kubecli.NewClientFactory(signatureService, reverseTunnelService, instanceID, dataStore)
}
func initSnapshotService(snapshotIntervalFromFlag string, dataStore dataservices.DataStore, dockerClientFactory *docker.ClientFactory, kubernetesClientFactory *kubecli.ClientFactory, shutdownCtx context.Context) (portainer.SnapshotService, error) {
dockerSnapshotter := docker.NewSnapshotter(dockerClientFactory)
kubernetesSnapshotter := kubernetes.NewSnapshotter(kubernetesClientFactory)
snapshotService, err := snapshot.NewService(snapshotIntervalFromFlag, dataStore, dockerSnapshotter, kubernetesSnapshotter, shutdownCtx)
func initSnapshotService(snapshotIntervalFromFlag string, dataStore dataservices.DataStore, dockerClientFactory *docker2.ClientFactory, kubernetesClientFactory *kubecli.ClientFactory, shutdownCtx context.Context) (portainer.SnapshotService, error) {
snapshotService, err := snapshot.NewService(snapshotIntervalFromFlag, dataStore, dockerClientFactory, kubernetesClientFactory, shutdownCtx)
if err != nil {
return nil, err
}
@@ -375,7 +372,7 @@ func initKeyPair(fileService portainer.FileService, signatureService portainer.D
}
func createTLSSecuredEndpoint(flags *portainer.CLIFlags, dataStore dataservices.DataStore, snapshotService portainer.SnapshotService) error {
tlsConfiguration := portainer.TLSConfiguration{
tlsConfiguration := database.TLSConfiguration{
TLS: *flags.TLS,
TLSSkipVerify: *flags.TLSSkipVerify,
}
@@ -388,34 +385,11 @@ func createTLSSecuredEndpoint(flags *portainer.CLIFlags, dataStore dataservices.
tlsConfiguration.TLS = true
}
endpointID := dataStore.Endpoint().GetNextIdentifier()
endpoint := &portainer.Endpoint{
ID: portainer.EndpointID(endpointID),
Name: "primary",
URL: *flags.EndpointURL,
GroupID: portainer.EndpointGroupID(1),
Type: portainer.DockerEnvironment,
TLSConfig: tlsConfiguration,
UserAccessPolicies: portainer.UserAccessPolicies{},
TeamAccessPolicies: portainer.TeamAccessPolicies{},
TagIDs: []portainer.TagID{},
Status: portainer.EndpointStatusUp,
Snapshots: []portainer.DockerSnapshot{},
Kubernetes: portainer.KubernetesDefault(),
SecuritySettings: portainer.EndpointSecuritySettings{
AllowVolumeBrowserForRegularUsers: false,
EnableHostManagementFeatures: false,
AllowSysctlSettingForRegularUsers: true,
AllowBindMountsForRegularUsers: true,
AllowPrivilegedModeForRegularUsers: true,
AllowHostNamespaceForRegularUsers: true,
AllowContainerCapabilitiesForRegularUsers: true,
AllowDeviceMappingForRegularUsers: true,
AllowStackManagementForRegularUsers: true,
},
}
endpoint := dataStore.Endpoint().NewDefault()
endpoint.Name = "primary"
endpoint.URL = *flags.EndpointURL
endpoint.GroupID = portainer.EndpointGroupID(1)
endpoint.Type = portainer.DockerEnvironment
if strings.HasPrefix(endpoint.URL, "tcp://") {
tlsConfig, err := crypto.CreateTLSConfigurationFromDisk(tlsConfiguration.TLSCACertPath, tlsConfiguration.TLSCertPath, tlsConfiguration.TLSKeyPath, tlsConfiguration.TLSSkipVerify)
@@ -449,34 +423,11 @@ func createUnsecuredEndpoint(endpointURL string, dataStore dataservices.DataStor
}
}
endpointID := dataStore.Endpoint().GetNextIdentifier()
endpoint := &portainer.Endpoint{
ID: portainer.EndpointID(endpointID),
Name: "primary",
URL: endpointURL,
GroupID: portainer.EndpointGroupID(1),
Type: portainer.DockerEnvironment,
TLSConfig: portainer.TLSConfiguration{},
UserAccessPolicies: portainer.UserAccessPolicies{},
TeamAccessPolicies: portainer.TeamAccessPolicies{},
TagIDs: []portainer.TagID{},
Status: portainer.EndpointStatusUp,
Snapshots: []portainer.DockerSnapshot{},
Kubernetes: portainer.KubernetesDefault(),
SecuritySettings: portainer.EndpointSecuritySettings{
AllowVolumeBrowserForRegularUsers: false,
EnableHostManagementFeatures: false,
AllowSysctlSettingForRegularUsers: true,
AllowBindMountsForRegularUsers: true,
AllowPrivilegedModeForRegularUsers: true,
AllowHostNamespaceForRegularUsers: true,
AllowContainerCapabilitiesForRegularUsers: true,
AllowDeviceMappingForRegularUsers: true,
AllowStackManagementForRegularUsers: true,
},
}
endpoint := dataStore.Endpoint().NewDefault()
endpoint.Name = "primary"
endpoint.URL = endpointURL
endpoint.GroupID = portainer.EndpointGroupID(1)
endpoint.Type = portainer.DockerEnvironment
err := snapshotService.SnapshotEndpoint(endpoint)
if err != nil {
@@ -599,7 +550,7 @@ func buildServer(flags *portainer.CLIFlags) portainer.Server {
kubernetesTokenCacheManager := kubeproxy.NewTokenCacheManager()
kubeConfigService := kubernetes.NewKubeConfigCAService(*flags.AddrHTTPS, sslSettings.CertPath)
kubeConfigService := kubernetes2.NewKubeConfigCAService(*flags.AddrHTTPS, sslSettings.CertPath)
proxyManager := proxy.NewManager(dataStore, digitalSignatureService, reverseTunnelService, dockerClientFactory, kubernetesClientFactory, kubernetesTokenCacheManager)

View File

@@ -1,4 +1,4 @@
package portainer
package database
import (
"io"

View File

@@ -3,12 +3,11 @@ package database
import (
"fmt"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database/boltdb"
)
// NewDatabase should use config options to return a connection to the requested database
func NewDatabase(storeType, storePath string, encryptionKey []byte) (connection portainer.Connection, err error) {
func NewDatabase(storeType, storePath string, encryptionKey []byte) (connection Connection, err error) {
switch storeType {
case "boltdb":
return &boltdb.DbConnection{

41
api/database/types.go Normal file
View File

@@ -0,0 +1,41 @@
package database
//TODO: as the dependencies get simpler, these should move to their respective dataservices
// EndpointID represents an environment(endpoint) identifier
type EndpointID int
// UserAccessPolicies represent the association of an access policy and a user
type UserAccessPolicies map[UserID]AccessPolicy
// TeamAccessPolicies represent the association of an access policy and a team
type TeamAccessPolicies map[TeamID]AccessPolicy
// TLSConfiguration represents a TLS configuration
type TLSConfiguration struct {
// Use TLS
TLS bool `json:"TLS" example:"true"`
// Skip the verification of the server TLS certificate
TLSSkipVerify bool `json:"TLSSkipVerify" example:"false"`
// Path to the TLS CA certificate file
TLSCACertPath string `json:"TLSCACert,omitempty" example:"/data/tls/ca.pem"`
// Path to the TLS client certificate file
TLSCertPath string `json:"TLSCert,omitempty" example:"/data/tls/cert.pem"`
// Path to the TLS client key file
TLSKeyPath string `json:"TLSKey,omitempty" example:"/data/tls/key.pem"`
}
// TeamID represents a team identifier
type TeamID int
// UserID represents a user identifier
type UserID int
// AccessPolicy represent a policy that can be associated to a user or team
type AccessPolicy struct {
// Role identifier. Reference the role that will be associated to this access policy
RoleID RoleID `json:"RoleId" example:"1"`
}
// RoleID represents a role identifier
type RoleID int

View File

@@ -3,6 +3,7 @@ package apikeyrepository
import (
"bytes"
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices/errors"
@@ -16,11 +17,11 @@ const (
// Service represents a service for managing api-key data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err
@@ -32,7 +33,7 @@ func NewService(connection portainer.Connection) (*Service, error) {
}
// GetAPIKeysByUserID returns a slice containing all the APIKeys a user has access to.
func (service *Service) GetAPIKeysByUserID(userID portainer.UserID) ([]portainer.APIKey, error) {
func (service *Service) GetAPIKeysByUserID(userID database.UserID) ([]portainer.APIKey, error) {
var result = make([]portainer.APIKey, 0)
err := service.connection.GetAll(

View File

@@ -2,6 +2,7 @@ package customtemplate
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
@@ -14,7 +15,7 @@ const (
// Service represents a service for managing custom template data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +23,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -1,7 +1,7 @@
package dockerhub
import (
portainer "github.com/portainer/portainer/api"
portainer "github.com/portainer/portainer/api/database"
)
const (
@@ -10,6 +10,8 @@ const (
dockerHubKey = "DOCKERHUB"
)
// TODO: does this get used anymore?
// Service represents a service for managing Dockerhub data.
type Service struct {
connection portainer.Connection
@@ -32,8 +34,8 @@ func NewService(connection portainer.Connection) (*Service, error) {
}
// DockerHub returns the DockerHub object.
func (service *Service) DockerHub() (*portainer.DockerHub, error) {
var dockerhub portainer.DockerHub
func (service *Service) DockerHub() (*DockerHub, error) {
var dockerhub DockerHub
err := service.connection.GetObject(BucketName, []byte(dockerHubKey), &dockerhub)
if err != nil {
@@ -44,6 +46,16 @@ func (service *Service) DockerHub() (*portainer.DockerHub, error) {
}
// UpdateDockerHub updates a DockerHub object.
func (service *Service) UpdateDockerHub(dockerhub *portainer.DockerHub) error {
func (service *Service) UpdateDockerHub(dockerhub *DockerHub) error {
return service.connection.UpdateObject(BucketName, []byte(dockerHubKey), dockerhub)
}
// DockerHub represents all the required information to connect and use the Docker Hub
type DockerHub struct {
// Is authentication against DockerHub enabled
Authentication bool `json:"Authentication" example:"true"`
// Username used to authenticate against the DockerHub
Username string `json:"Username" example:"user"`
// Password used to authenticate against the DockerHub
Password string `json:"Password,omitempty" example:"passwd"`
}

View File

@@ -2,6 +2,7 @@ package edgegroup
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
@@ -14,7 +15,7 @@ const (
// Service represents a service for managing Edge group data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +23,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,8 +2,7 @@ package edgejob
import (
"fmt"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
"github.com/sirupsen/logrus"
)
@@ -14,7 +13,7 @@ const (
// Service represents a service for managing edge jobs data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +21,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err
@@ -34,29 +33,29 @@ func NewService(connection portainer.Connection) (*Service, error) {
}
// EdgeJobs returns a list of Edge jobs
func (service *Service) EdgeJobs() ([]portainer.EdgeJob, error) {
var edgeJobs = make([]portainer.EdgeJob, 0)
func (service *Service) EdgeJobs() ([]EdgeJob, error) {
var edgeJobs = make([]EdgeJob, 0)
err := service.connection.GetAll(
BucketName,
&portainer.EdgeJob{},
&EdgeJob{},
func(obj interface{}) (interface{}, error) {
//var tag portainer.Tag
job, ok := obj.(*portainer.EdgeJob)
job, ok := obj.(*EdgeJob)
if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to EdgeJob object")
return nil, fmt.Errorf("Failed to convert to EdgeJob object: %s", obj)
}
edgeJobs = append(edgeJobs, *job)
return &portainer.EdgeJob{}, nil
return &EdgeJob{}, nil
})
return edgeJobs, err
}
// EdgeJob returns an Edge job by ID
func (service *Service) EdgeJob(ID portainer.EdgeJobID) (*portainer.EdgeJob, error) {
var edgeJob portainer.EdgeJob
func (service *Service) EdgeJob(ID EdgeJobID) (*EdgeJob, error) {
var edgeJob EdgeJob
identifier := service.connection.ConvertToKey(int(ID))
err := service.connection.GetObject(BucketName, identifier, &edgeJob)
@@ -68,24 +67,24 @@ func (service *Service) EdgeJob(ID portainer.EdgeJobID) (*portainer.EdgeJob, err
}
// CreateEdgeJob creates a new Edge job
func (service *Service) Create(edgeJob *portainer.EdgeJob) error {
func (service *Service) Create(edgeJob *EdgeJob) error {
return service.connection.CreateObject(
BucketName,
func(id uint64) (int, interface{}) {
edgeJob.ID = portainer.EdgeJobID(id)
edgeJob.ID = EdgeJobID(id)
return int(edgeJob.ID), edgeJob
},
)
}
// UpdateEdgeJob updates an Edge job by ID
func (service *Service) UpdateEdgeJob(ID portainer.EdgeJobID, edgeJob *portainer.EdgeJob) error {
func (service *Service) UpdateEdgeJob(ID EdgeJobID, edgeJob *EdgeJob) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.UpdateObject(BucketName, identifier, edgeJob)
}
// DeleteEdgeJob deletes an Edge job
func (service *Service) DeleteEdgeJob(ID portainer.EdgeJobID) error {
func (service *Service) DeleteEdgeJob(ID EdgeJobID) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.DeleteObject(BucketName, identifier)
}
@@ -94,3 +93,28 @@ func (service *Service) DeleteEdgeJob(ID portainer.EdgeJobID) error {
func (service *Service) GetNextIdentifier() int {
return service.connection.GetNextIdentifier(BucketName)
}
// EdgeJob represents a job that can run on Edge environments(endpoints).
type EdgeJob struct {
// EdgeJob Identifier
ID EdgeJobID `json:"Id" example:"1"`
Created int64 `json:"Created"`
CronExpression string `json:"CronExpression"`
Endpoints map[database.EndpointID]EdgeJobEndpointMeta `json:"Endpoints"`
Name string `json:"Name"`
ScriptPath string `json:"ScriptPath"`
Recurring bool `json:"Recurring"`
Version int `json:"Version"`
}
// EdgeJobEndpointMeta represents a meta data object for an Edge job and Environment(Endpoint) relation
type EdgeJobEndpointMeta struct {
LogsStatus EdgeJobLogsStatus
CollectLogs bool
}
// EdgeJobID represents an Edge job identifier
type EdgeJobID int
// EdgeJobLogsStatus represent status of logs collection job
type EdgeJobLogsStatus int

View File

@@ -2,6 +2,7 @@ package edgestack
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
@@ -14,7 +15,7 @@ const (
// Service represents a service for managing Edge stack data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +23,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,8 +2,8 @@ package endpoint
import (
"fmt"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
"github.com/sirupsen/logrus"
)
@@ -14,7 +14,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +22,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err
@@ -34,7 +34,7 @@ func NewService(connection portainer.Connection) (*Service, error) {
}
// Endpoint returns an environment(endpoint) by ID.
func (service *Service) Endpoint(ID portainer.EndpointID) (*portainer.Endpoint, error) {
func (service *Service) Endpoint(ID database.EndpointID) (*portainer.Endpoint, error) {
var endpoint portainer.Endpoint
identifier := service.connection.ConvertToKey(int(ID))
@@ -47,13 +47,13 @@ func (service *Service) Endpoint(ID portainer.EndpointID) (*portainer.Endpoint,
}
// UpdateEndpoint updates an environment(endpoint).
func (service *Service) UpdateEndpoint(ID portainer.EndpointID, endpoint *portainer.Endpoint) error {
func (service *Service) UpdateEndpoint(ID database.EndpointID, endpoint *portainer.Endpoint) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.UpdateObject(BucketName, identifier, endpoint)
}
// DeleteEndpoint deletes an environment(endpoint).
func (service *Service) DeleteEndpoint(ID portainer.EndpointID) error {
func (service *Service) DeleteEndpoint(ID database.EndpointID) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.DeleteObject(BucketName, identifier)
}
@@ -80,10 +80,58 @@ func (service *Service) Endpoints() ([]portainer.Endpoint, error) {
// CreateEndpoint assign an ID to a new environment(endpoint) and saves it.
func (service *Service) Create(endpoint *portainer.Endpoint) error {
if int(endpoint.ID) == 0 {
// TODO: hopefully this can become the only path
endpoint.ID = database.EndpointID(service.getNextIdentifier())
}
return service.connection.CreateObjectWithSetSequence(BucketName, int(endpoint.ID), endpoint)
}
// GetNextIdentifier returns the next identifier for an environment(endpoint).
func (service *Service) GetNextIdentifier() int {
func (service *Service) getNextIdentifier() int {
return service.connection.GetNextIdentifier(BucketName)
}
func (service *Service) NewDefault() *portainer.Endpoint {
return &portainer.Endpoint{
//ID: 0,
//Name: "primary",
//URL: *flags.EndpointURL,
//GroupID: portainer.EndpointGroupID(1),
//Type: portainer.DockerEnvironment,
TLSConfig: database.TLSConfiguration{
TLS: false,
},
UserAccessPolicies: database.UserAccessPolicies{},
TeamAccessPolicies: database.TeamAccessPolicies{},
TagIDs: []portainer.TagID{},
Status: portainer.EndpointStatusUp,
Snapshots: []portainer.DockerSnapshot{},
Kubernetes: kubernetesDefault(),
SecuritySettings: portainer.EndpointSecuritySettings{
AllowVolumeBrowserForRegularUsers: false,
EnableHostManagementFeatures: false,
AllowSysctlSettingForRegularUsers: true,
AllowBindMountsForRegularUsers: true,
AllowPrivilegedModeForRegularUsers: true,
AllowHostNamespaceForRegularUsers: true,
AllowContainerCapabilitiesForRegularUsers: true,
AllowDeviceMappingForRegularUsers: true,
AllowStackManagementForRegularUsers: true,
},
}
}
func kubernetesDefault() portainer.KubernetesData {
return portainer.KubernetesData{
Configuration: portainer.KubernetesConfiguration{
UseLoadBalancer: false,
UseServerMetrics: false,
StorageClasses: []portainer.KubernetesStorageClassConfig{},
IngressClasses: []portainer.KubernetesIngressClassConfig{},
},
Snapshots: []portainer.KubernetesSnapshot{},
}
}

View File

@@ -2,6 +2,7 @@ package endpointgroup
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
@@ -14,7 +15,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +23,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,8 +2,8 @@ package endpointrelation
import (
"fmt"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
"github.com/sirupsen/logrus"
)
@@ -14,7 +14,7 @@ const (
// Service represents a service for managing environment(endpoint) relation data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +22,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err
@@ -54,7 +54,7 @@ func (service *Service) EndpointRelations() ([]portainer.EndpointRelation, error
}
// EndpointRelation returns a Environment(Endpoint) relation object by EndpointID
func (service *Service) EndpointRelation(endpointID portainer.EndpointID) (*portainer.EndpointRelation, error) {
func (service *Service) EndpointRelation(endpointID database.EndpointID) (*portainer.EndpointRelation, error) {
var endpointRelation portainer.EndpointRelation
identifier := service.connection.ConvertToKey(int(endpointID))
@@ -72,13 +72,13 @@ func (service *Service) Create(endpointRelation *portainer.EndpointRelation) err
}
// UpdateEndpointRelation updates an Environment(Endpoint) relation object
func (service *Service) UpdateEndpointRelation(EndpointID portainer.EndpointID, endpointRelation *portainer.EndpointRelation) error {
func (service *Service) UpdateEndpointRelation(EndpointID database.EndpointID, endpointRelation *portainer.EndpointRelation) error {
identifier := service.connection.ConvertToKey(int(EndpointID))
return service.connection.UpdateObject(BucketName, identifier, endpointRelation)
}
// DeleteEndpointRelation deletes an Environment(Endpoint) relation object
func (service *Service) DeleteEndpointRelation(EndpointID portainer.EndpointID) error {
func (service *Service) DeleteEndpointRelation(EndpointID database.EndpointID) error {
identifier := service.connection.ConvertToKey(int(EndpointID))
return service.connection.DeleteObject(BucketName, identifier)
}

View File

@@ -2,6 +2,7 @@ package extension
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
@@ -14,7 +15,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +23,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,6 +2,7 @@ package fdoprofile
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
@@ -14,7 +15,7 @@ const (
// Service represents a service for managingFDO Profiles data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +23,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,6 +2,7 @@ package helmuserrepository
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
@@ -14,7 +15,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +23,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err
@@ -54,7 +55,7 @@ func (service *Service) HelmUserRepositories() ([]portainer.HelmUserRepository,
}
// HelmUserRepositoryByUserID return an array containing all the HelmUserRepository objects where the specified userID is present.
func (service *Service) HelmUserRepositoryByUserID(userID portainer.UserID) ([]portainer.HelmUserRepository, error) {
func (service *Service) HelmUserRepositoryByUserID(userID database.UserID) ([]portainer.HelmUserRepository, error) {
var result = make([]portainer.HelmUserRepository, 0)
err := service.connection.GetAll(

View File

@@ -3,6 +3,9 @@ package dataservices
// "github.com/portainer/portainer/api/dataservices"
import (
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/edgejob"
"github.com/portainer/portainer/api/dataservices/registry"
"io"
"time"
@@ -72,11 +75,11 @@ type (
// EdgeJobService represents a service to manage Edge jobs
EdgeJobService interface {
EdgeJobs() ([]portainer.EdgeJob, error)
EdgeJob(ID portainer.EdgeJobID) (*portainer.EdgeJob, error)
Create(edgeJob *portainer.EdgeJob) error
UpdateEdgeJob(ID portainer.EdgeJobID, edgeJob *portainer.EdgeJob) error
DeleteEdgeJob(ID portainer.EdgeJobID) error
EdgeJobs() ([]edgejob.EdgeJob, error)
EdgeJob(ID edgejob.EdgeJobID) (*edgejob.EdgeJob, error)
Create(edgeJob *edgejob.EdgeJob) error
UpdateEdgeJob(ID edgejob.EdgeJobID, edgeJob *edgejob.EdgeJob) error
DeleteEdgeJob(ID edgejob.EdgeJobID) error
GetNextIdentifier() int
BucketName() string
}
@@ -94,12 +97,13 @@ type (
// EndpointService represents a service for managing environment(endpoint) data
EndpointService interface {
Endpoint(ID portainer.EndpointID) (*portainer.Endpoint, error)
Endpoint(ID database.EndpointID) (*portainer.Endpoint, error)
Endpoints() ([]portainer.Endpoint, error)
Create(endpoint *portainer.Endpoint) error
UpdateEndpoint(ID portainer.EndpointID, endpoint *portainer.Endpoint) error
DeleteEndpoint(ID portainer.EndpointID) error
GetNextIdentifier() int
UpdateEndpoint(ID database.EndpointID, endpoint *portainer.Endpoint) error
DeleteEndpoint(ID database.EndpointID) error
//GetNextIdentifier() int
NewDefault() *portainer.Endpoint
BucketName() string
}
@@ -116,10 +120,10 @@ type (
// EndpointRelationService represents a service for managing environment(endpoint) relations data
EndpointRelationService interface {
EndpointRelations() ([]portainer.EndpointRelation, error)
EndpointRelation(EndpointID portainer.EndpointID) (*portainer.EndpointRelation, error)
EndpointRelation(EndpointID database.EndpointID) (*portainer.EndpointRelation, error)
Create(endpointRelation *portainer.EndpointRelation) error
UpdateEndpointRelation(EndpointID portainer.EndpointID, endpointRelation *portainer.EndpointRelation) error
DeleteEndpointRelation(EndpointID portainer.EndpointID) error
UpdateEndpointRelation(EndpointID database.EndpointID, endpointRelation *portainer.EndpointRelation) error
DeleteEndpointRelation(EndpointID database.EndpointID) error
BucketName() string
}
@@ -137,7 +141,7 @@ type (
// HelmUserRepositoryService represents a service to manage HelmUserRepositories
HelmUserRepositoryService interface {
HelmUserRepositories() ([]portainer.HelmUserRepository, error)
HelmUserRepositoryByUserID(userID portainer.UserID) ([]portainer.HelmUserRepository, error)
HelmUserRepositoryByUserID(userID database.UserID) ([]portainer.HelmUserRepository, error)
Create(record *portainer.HelmUserRepository) error
UpdateHelmUserRepository(ID portainer.HelmUserRepositoryID, repository *portainer.HelmUserRepository) error
DeleteHelmUserRepository(ID portainer.HelmUserRepositoryID) error
@@ -155,11 +159,11 @@ type (
// RegistryService represents a service for managing registry data
RegistryService interface {
Registry(ID portainer.RegistryID) (*portainer.Registry, error)
Registries() ([]portainer.Registry, error)
Create(registry *portainer.Registry) error
UpdateRegistry(ID portainer.RegistryID, registry *portainer.Registry) error
DeleteRegistry(ID portainer.RegistryID) error
Registry(ID registry.RegistryID) (*registry.Registry, error)
Registries() ([]registry.Registry, error)
Create(registry *registry.Registry) error
UpdateRegistry(ID registry.RegistryID, registry *registry.Registry) error
DeleteRegistry(ID registry.RegistryID) error
BucketName() string
}
@@ -176,10 +180,10 @@ type (
// RoleService represents a service for managing user roles
RoleService interface {
Role(ID portainer.RoleID) (*portainer.Role, error)
Role(ID database.RoleID) (*portainer.Role, error)
Roles() ([]portainer.Role, error)
Create(role *portainer.Role) error
UpdateRole(ID portainer.RoleID, role *portainer.Role) error
UpdateRole(ID database.RoleID, role *portainer.Role) error
BucketName() string
}
@@ -189,7 +193,7 @@ type (
GetAPIKey(keyID portainer.APIKeyID) (*portainer.APIKey, error)
UpdateAPIKey(key *portainer.APIKey) error
DeleteAPIKey(ID portainer.APIKeyID) error
GetAPIKeysByUserID(userID portainer.UserID) ([]portainer.APIKey, error)
GetAPIKeysByUserID(userID database.UserID) ([]portainer.APIKey, error)
GetAPIKeyByDigest(digest []byte) (*portainer.APIKey, error)
}
@@ -235,12 +239,12 @@ type (
// TeamService represents a service for managing user data
TeamService interface {
Team(ID portainer.TeamID) (*portainer.Team, error)
Team(ID database.TeamID) (*portainer.Team, error)
TeamByName(name string) (*portainer.Team, error)
Teams() ([]portainer.Team, error)
Create(team *portainer.Team) error
UpdateTeam(ID portainer.TeamID, team *portainer.Team) error
DeleteTeam(ID portainer.TeamID) error
UpdateTeam(ID database.TeamID, team *portainer.Team) error
DeleteTeam(ID database.TeamID) error
BucketName() string
}
@@ -248,13 +252,13 @@ type (
TeamMembershipService interface {
TeamMembership(ID portainer.TeamMembershipID) (*portainer.TeamMembership, error)
TeamMemberships() ([]portainer.TeamMembership, error)
TeamMembershipsByUserID(userID portainer.UserID) ([]portainer.TeamMembership, error)
TeamMembershipsByTeamID(teamID portainer.TeamID) ([]portainer.TeamMembership, error)
TeamMembershipsByUserID(userID database.UserID) ([]portainer.TeamMembership, error)
TeamMembershipsByTeamID(teamID database.TeamID) ([]portainer.TeamMembership, error)
Create(membership *portainer.TeamMembership) error
UpdateTeamMembership(ID portainer.TeamMembershipID, membership *portainer.TeamMembership) error
DeleteTeamMembership(ID portainer.TeamMembershipID) error
DeleteTeamMembershipByUserID(userID portainer.UserID) error
DeleteTeamMembershipByTeamID(teamID portainer.TeamID) error
DeleteTeamMembershipByUserID(userID database.UserID) error
DeleteTeamMembershipByTeamID(teamID database.TeamID) error
BucketName() string
}
@@ -267,13 +271,13 @@ type (
// UserService represents a service for managing user data
UserService interface {
User(ID portainer.UserID) (*portainer.User, error)
User(ID database.UserID) (*portainer.User, error)
UserByUsername(username string) (*portainer.User, error)
Users() ([]portainer.User, error)
UsersByRole(role portainer.UserRole) ([]portainer.User, error)
Create(user *portainer.User) error
UpdateUser(ID portainer.UserID, user *portainer.User) error
DeleteUser(ID portainer.UserID) error
UpdateUser(ID database.UserID, user *portainer.User) error
DeleteUser(ID database.UserID) error
BucketName() string
}

View File

@@ -2,8 +2,8 @@ package registry
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
)
@@ -14,7 +14,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +22,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err
@@ -34,8 +34,8 @@ func NewService(connection portainer.Connection) (*Service, error) {
}
// Registry returns an registry by ID.
func (service *Service) Registry(ID portainer.RegistryID) (*portainer.Registry, error) {
var registry portainer.Registry
func (service *Service) Registry(ID RegistryID) (*Registry, error) {
var registry Registry
identifier := service.connection.ConvertToKey(int(ID))
err := service.connection.GetObject(BucketName, identifier, &registry)
@@ -47,44 +47,128 @@ func (service *Service) Registry(ID portainer.RegistryID) (*portainer.Registry,
}
// Registries returns an array containing all the registries.
func (service *Service) Registries() ([]portainer.Registry, error) {
var registries = make([]portainer.Registry, 0)
func (service *Service) Registries() ([]Registry, error) {
var registries = make([]Registry, 0)
err := service.connection.GetAll(
BucketName,
&portainer.Registry{},
&Registry{},
func(obj interface{}) (interface{}, error) {
registry, ok := obj.(*portainer.Registry)
registry, ok := obj.(*Registry)
if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Registry object")
return nil, fmt.Errorf("Failed to convert to Registry object: %s", obj)
}
registries = append(registries, *registry)
return &portainer.Registry{}, nil
return &Registry{}, nil
})
return registries, err
}
// CreateRegistry creates a new registry.
func (service *Service) Create(registry *portainer.Registry) error {
func (service *Service) Create(registry *Registry) error {
return service.connection.CreateObject(
BucketName,
func(id uint64) (int, interface{}) {
registry.ID = portainer.RegistryID(id)
registry.ID = RegistryID(id)
return int(registry.ID), registry
},
)
}
// UpdateRegistry updates an registry.
func (service *Service) UpdateRegistry(ID portainer.RegistryID, registry *portainer.Registry) error {
func (service *Service) UpdateRegistry(ID RegistryID, registry *Registry) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.UpdateObject(BucketName, identifier, registry)
}
// DeleteRegistry deletes an registry.
func (service *Service) DeleteRegistry(ID portainer.RegistryID) error {
func (service *Service) DeleteRegistry(ID RegistryID) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.DeleteObject(BucketName, identifier)
}
// Registry represents a Docker registry with all the info required to connect to it
type Registry struct {
// Registry Identifier
ID RegistryID `json:"Id" example:"1"`
// Registry Type (1 - Quay, 2 - Azure, 3 - Custom, 4 - Gitlab, 5 - ProGet, 6 - DockerHub, 7 - ECR)
Type RegistryType `json:"Type" enums:"1,2,3,4,5,6,7"`
// Registry Name
Name string `json:"Name" example:"my-registry"`
// URL or IP address of the Docker registry
URL string `json:"URL" example:"registry.mydomain.tld:2375"`
// Base URL, introduced for ProGet registry
BaseURL string `json:"BaseURL" example:"registry.mydomain.tld:2375"`
// Is authentication against this registry enabled
Authentication bool `json:"Authentication" example:"true"`
// Username or AccessKeyID used to authenticate against this registry
Username string `json:"Username" example:"registry user"`
// Password or SecretAccessKey used to authenticate against this registry
Password string `json:"Password,omitempty" example:"registry_password"`
ManagementConfiguration *RegistryManagementConfiguration `json:"ManagementConfiguration"`
Gitlab GitlabRegistryData `json:"Gitlab"`
Quay QuayRegistryData `json:"Quay"`
Ecr EcrData `json:"Ecr"`
RegistryAccesses RegistryAccesses `json:"RegistryAccesses"`
// Deprecated fields
// Deprecated in DBVersion == 31
UserAccessPolicies database.UserAccessPolicies `json:"UserAccessPolicies"`
// Deprecated in DBVersion == 31
TeamAccessPolicies database.TeamAccessPolicies `json:"TeamAccessPolicies"`
// Deprecated in DBVersion == 18
AuthorizedUsers []database.UserID `json:"AuthorizedUsers"`
// Deprecated in DBVersion == 18
AuthorizedTeams []database.TeamID `json:"AuthorizedTeams"`
// Stores temporary access token
AccessToken string `json:"AccessToken,omitempty"`
AccessTokenExpiry int64 `json:"AccessTokenExpiry,omitempty"`
}
type RegistryAccesses map[database.EndpointID]RegistryAccessPolicies
type RegistryAccessPolicies struct {
UserAccessPolicies database.UserAccessPolicies `json:"UserAccessPolicies"`
TeamAccessPolicies database.TeamAccessPolicies `json:"TeamAccessPolicies"`
Namespaces []string `json:"Namespaces"`
}
// RegistryID represents a registry identifier
type RegistryID int
// RegistryManagementConfiguration represents a configuration that can be used to query the registry API via the registry management extension.
type RegistryManagementConfiguration struct {
Type RegistryType `json:"Type"`
Authentication bool `json:"Authentication"`
Username string `json:"Username"`
Password string `json:"Password"`
TLSConfig database.TLSConfiguration `json:"TLSConfig"`
Ecr EcrData `json:"Ecr"`
AccessToken string `json:"AccessToken,omitempty"`
AccessTokenExpiry int64 `json:"AccessTokenExpiry,omitempty"`
}
// RegistryType represents a type of registry
type RegistryType int
// GitlabRegistryData represents data required for gitlab registry to work
type GitlabRegistryData struct {
ProjectID int `json:"ProjectId"`
InstanceURL string `json:"InstanceURL"`
ProjectPath string `json:"ProjectPath"`
}
// QuayRegistryData represents data required for Quay registry to work
type QuayRegistryData struct {
UseOrganisation bool `json:"UseOrganisation"`
OrganisationName string `json:"OrganisationName"`
}
// EcrData represents data required for ECR registry
type EcrData struct {
Region string `json:"Region" example:"ap-southeast-2"`
}

View File

@@ -2,6 +2,7 @@ package resourcecontrol
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
@@ -14,7 +15,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +23,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,6 +2,7 @@ package role
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
@@ -14,7 +15,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +23,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err
@@ -34,7 +35,7 @@ func NewService(connection portainer.Connection) (*Service, error) {
}
// Role returns a Role by ID
func (service *Service) Role(ID portainer.RoleID) (*portainer.Role, error) {
func (service *Service) Role(ID database.RoleID) (*portainer.Role, error) {
var set portainer.Role
identifier := service.connection.ConvertToKey(int(ID))
@@ -71,14 +72,14 @@ func (service *Service) Create(role *portainer.Role) error {
return service.connection.CreateObject(
BucketName,
func(id uint64) (int, interface{}) {
role.ID = portainer.RoleID(id)
role.ID = database.RoleID(id)
return int(role.ID), role
},
)
}
// UpdateRole updates a role.
func (service *Service) UpdateRole(ID portainer.RoleID, role *portainer.Role) error {
func (service *Service) UpdateRole(ID database.RoleID, role *portainer.Role) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.UpdateObject(BucketName, identifier, role)
}

View File

@@ -2,8 +2,8 @@ package schedule
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
)
@@ -14,7 +14,7 @@ const (
// Service represents a service for managing schedule data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +22,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err
@@ -34,8 +34,8 @@ func NewService(connection portainer.Connection) (*Service, error) {
}
// Schedule returns a schedule by ID.
func (service *Service) Schedule(ID portainer.ScheduleID) (*portainer.Schedule, error) {
var schedule portainer.Schedule
func (service *Service) Schedule(ID ScheduleID) (*Schedule, error) {
var schedule Schedule
identifier := service.connection.ConvertToKey(int(ID))
err := service.connection.GetObject(BucketName, identifier, &schedule)
@@ -47,32 +47,32 @@ func (service *Service) Schedule(ID portainer.ScheduleID) (*portainer.Schedule,
}
// UpdateSchedule updates a schedule.
func (service *Service) UpdateSchedule(ID portainer.ScheduleID, schedule *portainer.Schedule) error {
func (service *Service) UpdateSchedule(ID ScheduleID, schedule *Schedule) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.UpdateObject(BucketName, identifier, schedule)
}
// DeleteSchedule deletes a schedule.
func (service *Service) DeleteSchedule(ID portainer.ScheduleID) error {
func (service *Service) DeleteSchedule(ID ScheduleID) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.DeleteObject(BucketName, identifier)
}
// Schedules return a array containing all the schedules.
func (service *Service) Schedules() ([]portainer.Schedule, error) {
var schedules = make([]portainer.Schedule, 0)
func (service *Service) Schedules() ([]Schedule, error) {
var schedules = make([]Schedule, 0)
err := service.connection.GetAll(
BucketName,
&portainer.Schedule{},
&Schedule{},
func(obj interface{}) (interface{}, error) {
schedule, ok := obj.(*portainer.Schedule)
schedule, ok := obj.(*Schedule)
if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Schedule object")
return nil, fmt.Errorf("Failed to convert to Schedule object: %s", obj)
}
schedules = append(schedules, *schedule)
return &portainer.Schedule{}, nil
return &Schedule{}, nil
})
return schedules, err
@@ -80,14 +80,14 @@ func (service *Service) Schedules() ([]portainer.Schedule, error) {
// SchedulesByJobType return a array containing all the schedules
// with the specified JobType.
func (service *Service) SchedulesByJobType(jobType portainer.JobType) ([]portainer.Schedule, error) {
var schedules = make([]portainer.Schedule, 0)
func (service *Service) SchedulesByJobType(jobType JobType) ([]Schedule, error) {
var schedules = make([]Schedule, 0)
err := service.connection.GetAll(
BucketName,
&portainer.Schedule{},
&Schedule{},
func(obj interface{}) (interface{}, error) {
schedule, ok := obj.(*portainer.Schedule)
schedule, ok := obj.(*Schedule)
if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Schedule object")
return nil, fmt.Errorf("Failed to convert to Schedule object: %s", obj)
@@ -95,14 +95,14 @@ func (service *Service) SchedulesByJobType(jobType portainer.JobType) ([]portain
if schedule.JobType == jobType {
schedules = append(schedules, *schedule)
}
return &portainer.Schedule{}, nil
return &Schedule{}, nil
})
return schedules, err
}
// Create assign an ID to a new schedule and saves it.
func (service *Service) CreateSchedule(schedule *portainer.Schedule) error {
func (service *Service) CreateSchedule(schedule *Schedule) error {
return service.connection.CreateObjectWithSetSequence(BucketName, int(schedule.ID), schedule)
}
@@ -110,3 +110,43 @@ func (service *Service) CreateSchedule(schedule *portainer.Schedule) error {
func (service *Service) GetNextIdentifier() int {
return service.connection.GetNextIdentifier(BucketName)
}
// Schedule represents a scheduled job.
// It only contains a pointer to one of the JobRunner implementations
// based on the JobType.
// NOTE: The Recurring option is only used by ScriptExecutionJob at the moment
// Deprecated in favor of EdgeJob
type Schedule struct {
// Schedule Identifier
ID ScheduleID `json:"Id" example:"1"`
Name string
CronExpression string
Recurring bool
Created int64
JobType JobType
EdgeSchedule *EdgeSchedule
}
// EdgeSchedule represents a scheduled job that can run on Edge environments(endpoints).
// Deprecated in favor of EdgeJob
type EdgeSchedule struct {
// EdgeSchedule Identifier
ID ScheduleID `json:"Id" example:"1"`
CronExpression string `json:"CronExpression"`
Script string `json:"Script"`
Version int `json:"Version"`
Endpoints []database.EndpointID `json:"Endpoints"`
}
// ScheduleID represents a schedule identifier.
// Deprecated in favor of EdgeJob
type ScheduleID int
// JobType represents a job type
type JobType int
const (
_ JobType = iota
// SnapshotJobType is a system job used to create environment(endpoint) snapshots
SnapshotJobType = 2
)

View File

@@ -2,6 +2,7 @@ package settings
import (
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
)
const (
@@ -12,7 +13,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -20,7 +21,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,6 +2,7 @@ package ssl
import (
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
)
const (
@@ -12,7 +13,7 @@ const (
// Service represents a service for managing ssl data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -20,7 +21,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,6 +2,7 @@ package stack
import (
"fmt"
"github.com/portainer/portainer/api/database"
"strings"
"github.com/sirupsen/logrus"
@@ -17,7 +18,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -25,7 +26,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,6 +2,7 @@ package tag
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
@@ -14,7 +15,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +23,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,6 +2,7 @@ package team
import (
"fmt"
"github.com/portainer/portainer/api/database"
"strings"
"github.com/portainer/portainer/api/dataservices/errors"
@@ -17,7 +18,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -25,7 +26,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err
@@ -37,7 +38,7 @@ func NewService(connection portainer.Connection) (*Service, error) {
}
// Team returns a Team by ID
func (service *Service) Team(ID portainer.TeamID) (*portainer.Team, error) {
func (service *Service) Team(ID database.TeamID) (*portainer.Team, error) {
var team portainer.Team
identifier := service.connection.ConvertToKey(int(ID))
@@ -100,7 +101,7 @@ func (service *Service) Teams() ([]portainer.Team, error) {
}
// UpdateTeam saves a Team.
func (service *Service) UpdateTeam(ID portainer.TeamID, team *portainer.Team) error {
func (service *Service) UpdateTeam(ID database.TeamID, team *portainer.Team) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.UpdateObject(BucketName, identifier, team)
}
@@ -110,14 +111,14 @@ func (service *Service) Create(team *portainer.Team) error {
return service.connection.CreateObject(
BucketName,
func(id uint64) (int, interface{}) {
team.ID = portainer.TeamID(id)
team.ID = database.TeamID(id)
return int(team.ID), team
},
)
}
// DeleteTeam deletes a Team.
func (service *Service) DeleteTeam(ID portainer.TeamID) error {
func (service *Service) DeleteTeam(ID database.TeamID) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.DeleteObject(BucketName, identifier)
}

View File

@@ -1,6 +1,7 @@
package tests
import (
"github.com/portainer/portainer/api/database"
"testing"
portainer "github.com/portainer/portainer/api"
@@ -17,7 +18,7 @@ type teamBuilder struct {
func (b *teamBuilder) createNew(name string) *portainer.Team {
b.count++
team := &portainer.Team{
ID: portainer.TeamID(b.count),
ID: database.TeamID(b.count),
Name: name,
}

View File

@@ -2,6 +2,7 @@ package teammembership
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
@@ -14,7 +15,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -22,7 +23,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err
@@ -67,7 +68,7 @@ func (service *Service) TeamMemberships() ([]portainer.TeamMembership, error) {
}
// TeamMembershipsByUserID return an array containing all the TeamMembership objects where the specified userID is present.
func (service *Service) TeamMembershipsByUserID(userID portainer.UserID) ([]portainer.TeamMembership, error) {
func (service *Service) TeamMembershipsByUserID(userID database.UserID) ([]portainer.TeamMembership, error) {
var memberships = make([]portainer.TeamMembership, 0)
err := service.connection.GetAll(
@@ -89,7 +90,7 @@ func (service *Service) TeamMembershipsByUserID(userID portainer.UserID) ([]port
}
// TeamMembershipsByTeamID return an array containing all the TeamMembership objects where the specified teamID is present.
func (service *Service) TeamMembershipsByTeamID(teamID portainer.TeamID) ([]portainer.TeamMembership, error) {
func (service *Service) TeamMembershipsByTeamID(teamID database.TeamID) ([]portainer.TeamMembership, error) {
var memberships = make([]portainer.TeamMembership, 0)
err := service.connection.GetAll(
@@ -134,7 +135,7 @@ func (service *Service) DeleteTeamMembership(ID portainer.TeamMembershipID) erro
}
// DeleteTeamMembershipByUserID deletes all the TeamMembership object associated to a UserID.
func (service *Service) DeleteTeamMembershipByUserID(userID portainer.UserID) error {
func (service *Service) DeleteTeamMembershipByUserID(userID database.UserID) error {
return service.connection.DeleteAllObjects(
BucketName,
func(obj interface{}) (id int, ok bool) {
@@ -152,7 +153,7 @@ func (service *Service) DeleteTeamMembershipByUserID(userID portainer.UserID) er
}
// DeleteTeamMembershipByTeamID deletes all the TeamMembership object associated to a TeamID.
func (service *Service) DeleteTeamMembershipByTeamID(teamID portainer.TeamID) error {
func (service *Service) DeleteTeamMembershipByTeamID(teamID database.TeamID) error {
return service.connection.DeleteAllObjects(
BucketName,
func(obj interface{}) (id int, ok bool) {

View File

@@ -2,6 +2,7 @@ package tunnelserver
import (
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
)
const (
@@ -12,7 +13,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -20,7 +21,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,6 +2,7 @@ package user
import (
"fmt"
"github.com/portainer/portainer/api/database"
"strings"
"github.com/portainer/portainer/api/dataservices/errors"
@@ -17,7 +18,7 @@ const (
// Service represents a service for managing environment(endpoint) data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -25,7 +26,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err
@@ -37,7 +38,7 @@ func NewService(connection portainer.Connection) (*Service, error) {
}
// User returns a user by ID
func (service *Service) User(ID portainer.UserID) (*portainer.User, error) {
func (service *Service) User(ID database.UserID) (*portainer.User, error) {
var user portainer.User
identifier := service.connection.ConvertToKey(int(ID))
@@ -121,7 +122,7 @@ func (service *Service) UsersByRole(role portainer.UserRole) ([]portainer.User,
}
// UpdateUser saves a user.
func (service *Service) UpdateUser(ID portainer.UserID, user *portainer.User) error {
func (service *Service) UpdateUser(ID database.UserID, user *portainer.User) error {
identifier := service.connection.ConvertToKey(int(ID))
user.Username = strings.ToLower(user.Username)
return service.connection.UpdateObject(BucketName, identifier, user)
@@ -132,7 +133,7 @@ func (service *Service) Create(user *portainer.User) error {
return service.connection.CreateObject(
BucketName,
func(id uint64) (int, interface{}) {
user.ID = portainer.UserID(id)
user.ID = database.UserID(id)
user.Username = strings.ToLower(user.Username)
return int(user.ID), user
@@ -141,7 +142,7 @@ func (service *Service) Create(user *portainer.User) error {
}
// DeleteUser deletes a user.
func (service *Service) DeleteUser(ID portainer.UserID) error {
func (service *Service) DeleteUser(ID database.UserID) error {
identifier := service.connection.ConvertToKey(int(ID))
return service.connection.DeleteObject(BucketName, identifier)
}

View File

@@ -1,6 +1,7 @@
package version
import (
"github.com/portainer/portainer/api/database"
"strconv"
portainer "github.com/portainer/portainer/api"
@@ -17,7 +18,7 @@ const (
// Service represents a service to manage stored versions.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -25,7 +26,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,6 +2,7 @@ package webhook
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices/errors"
@@ -15,7 +16,7 @@ const (
// Service represents a service for managing webhook data.
type Service struct {
connection portainer.Connection
connection database.Connection
}
func (service *Service) BucketName() string {
@@ -23,7 +24,7 @@ func (service *Service) BucketName() string {
}
// NewService creates a new instance of a service.
func NewService(connection portainer.Connection) (*Service, error) {
func NewService(connection database.Connection) (*Service, error) {
err := connection.SetServiceName(BucketName)
if err != nil {
return nil, err

View File

@@ -2,6 +2,7 @@ package datastore
import (
"fmt"
"github.com/portainer/portainer/api/database"
"io"
"os"
"path"
@@ -29,7 +30,7 @@ func (store *Store) edition() portainer.SoftwareEdition {
}
// NewStore initializes a new Store and the associated services
func NewStore(storePath string, fileService portainer.FileService, connection portainer.Connection) *Store {
func NewStore(storePath string, fileService portainer.FileService, connection database.Connection) *Store {
return &Store{
fileService: fileService,
connection: connection,

View File

@@ -2,6 +2,9 @@ package datastore
import (
"fmt"
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/registry"
schedule2 "github.com/portainer/portainer/api/dataservices/schedule"
"runtime"
"strings"
"testing"
@@ -83,7 +86,7 @@ func (store *Store) testEnvironments(t *testing.T) {
store.CreateEndpointRelation(id)
}
func newEndpoint(endpointType portainer.EndpointType, id portainer.EndpointID, name, URL string, TLS bool) *portainer.Endpoint {
func newEndpoint(endpointType portainer.EndpointType, id database.EndpointID, name, URL string, TLS bool) *portainer.Endpoint {
endpoint := &portainer.Endpoint{
ID: id,
Name: name,
@@ -91,11 +94,11 @@ func newEndpoint(endpointType portainer.EndpointType, id portainer.EndpointID, n
Type: endpointType,
GroupID: portainer.EndpointGroupID(1),
PublicURL: "",
TLSConfig: portainer.TLSConfiguration{
TLSConfig: database.TLSConfiguration{
TLS: false,
},
UserAccessPolicies: portainer.UserAccessPolicies{},
TeamAccessPolicies: portainer.TeamAccessPolicies{},
UserAccessPolicies: database.UserAccessPolicies{},
TeamAccessPolicies: database.TeamAccessPolicies{},
TagIDs: []portainer.TagID{},
Status: portainer.EndpointStatusUp,
Snapshots: []portainer.DockerSnapshot{},
@@ -103,7 +106,7 @@ func newEndpoint(endpointType portainer.EndpointType, id portainer.EndpointID, n
}
if TLS {
endpoint.TLSConfig = portainer.TLSConfiguration{
endpoint.TLSConfig = database.TLSConfiguration{
TLS: true,
TLSSkipVerify: true,
}
@@ -127,11 +130,11 @@ func setEndpointAuthorizations(endpoint *portainer.Endpoint) {
}
}
func (store *Store) CreateEndpoint(t *testing.T, name string, endpointType portainer.EndpointType, URL string, tls bool) portainer.EndpointID {
func (store *Store) CreateEndpoint(t *testing.T, name string, endpointType portainer.EndpointType, URL string, tls bool) database.EndpointID {
is := assert.New(t)
var expectedEndpoint *portainer.Endpoint
id := portainer.EndpointID(store.Endpoint().GetNextIdentifier())
id := database.EndpointID(store.Endpoint().GetNextIdentifier())
switch endpointType {
case portainer.DockerEnvironment:
@@ -174,7 +177,7 @@ func (store *Store) CreateEndpoint(t *testing.T, name string, endpointType porta
return endpoint.ID
}
func (store *Store) CreateEndpointRelation(id portainer.EndpointID) {
func (store *Store) CreateEndpointRelation(id database.EndpointID) {
relation := &portainer.EndpointRelation{
EndpointID: id,
EdgeStacks: map[portainer.EdgeStackID]bool{},
@@ -328,17 +331,17 @@ func (store *Store) testRegistries(t *testing.T) {
regService := store.RegistryService
is.NotNil(regService, "RegistryService shouldn't be nil")
reg1 := &portainer.Registry{
reg1 := &registry.Registry{
ID: 1,
Type: portainer.DockerHubRegistry,
Name: "Dockerhub Registry Test",
}
reg2 := &portainer.Registry{
reg2 := &registry.Registry{
ID: 2,
Type: portainer.GitlabRegistry,
Name: "Gitlab Registry Test",
Gitlab: portainer.GitlabRegistryData{
Gitlab: registry.GitlabRegistryData{
ProjectID: 12345,
InstanceURL: "http://gitlab.com/12345",
ProjectPath: "mytestproject",
@@ -372,8 +375,8 @@ func (store *Store) testSchedules(t *testing.T) {
is := assert.New(t)
schedule := store.ScheduleService
s := &portainer.Schedule{
ID: portainer.ScheduleID(schedule.GetNextIdentifier()),
s := &schedule2.Schedule{
ID: schedule2.ScheduleID(schedule.GetNextIdentifier()),
Name: "My Custom Schedule 1",
CronExpression: "*/5 * * * * portainer /bin/sh -c echo 'hello world'",
}

View File

@@ -3,6 +3,7 @@ package datastore
import (
"github.com/gofrs/uuid"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
)
// Init creates the default data set.
@@ -55,7 +56,7 @@ func (store *Store) checkOrCreateDefaultSettings() error {
LDAPSettings: portainer.LDAPSettings{
AnonymousMode: true,
AutoCreateUsers: true,
TLSConfig: portainer.TLSConfiguration{},
TLSConfig: database.TLSConfiguration{},
SearchSettings: []portainer.LDAPSearchSettings{
{},
},
@@ -112,8 +113,8 @@ func (store *Store) checkOrCreateDefaultData() error {
Name: "Unassigned",
Description: "Unassigned environments",
Labels: []portainer.Pair{},
UserAccessPolicies: portainer.UserAccessPolicies{},
TeamAccessPolicies: portainer.TeamAccessPolicies{},
UserAccessPolicies: database.UserAccessPolicies{},
TeamAccessPolicies: database.TeamAccessPolicies{},
TagIDs: []portainer.TagID{},
}

View File

@@ -1,9 +1,9 @@
package datastore
import (
portainer "github.com/portainer/portainer/api/database"
"testing"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/datastore/migrator"
"github.com/portainer/portainer/api/internal/authorization"
)

View File

@@ -2,6 +2,7 @@ package migrator
import (
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
)
func (m *Migrator) updateUsersToDBVersion18() error {
@@ -45,16 +46,16 @@ func (m *Migrator) updateEndpointsToDBVersion18() error {
}
for _, endpoint := range legacyEndpoints {
endpoint.UserAccessPolicies = make(portainer.UserAccessPolicies)
endpoint.UserAccessPolicies = make(database.UserAccessPolicies)
for _, userID := range endpoint.AuthorizedUsers {
endpoint.UserAccessPolicies[userID] = portainer.AccessPolicy{
endpoint.UserAccessPolicies[userID] = database.AccessPolicy{
RoleID: 4,
}
}
endpoint.TeamAccessPolicies = make(portainer.TeamAccessPolicies)
endpoint.TeamAccessPolicies = make(database.TeamAccessPolicies)
for _, teamID := range endpoint.AuthorizedTeams {
endpoint.TeamAccessPolicies[teamID] = portainer.AccessPolicy{
endpoint.TeamAccessPolicies[teamID] = database.AccessPolicy{
RoleID: 4,
}
}
@@ -75,16 +76,16 @@ func (m *Migrator) updateEndpointGroupsToDBVersion18() error {
}
for _, endpointGroup := range legacyEndpointGroups {
endpointGroup.UserAccessPolicies = make(portainer.UserAccessPolicies)
endpointGroup.UserAccessPolicies = make(database.UserAccessPolicies)
for _, userID := range endpointGroup.AuthorizedUsers {
endpointGroup.UserAccessPolicies[userID] = portainer.AccessPolicy{
endpointGroup.UserAccessPolicies[userID] = database.AccessPolicy{
RoleID: 4,
}
}
endpointGroup.TeamAccessPolicies = make(portainer.TeamAccessPolicies)
endpointGroup.TeamAccessPolicies = make(database.TeamAccessPolicies)
for _, teamID := range endpointGroup.AuthorizedTeams {
endpointGroup.TeamAccessPolicies[teamID] = portainer.AccessPolicy{
endpointGroup.TeamAccessPolicies[teamID] = database.AccessPolicy{
RoleID: 4,
}
}
@@ -105,14 +106,14 @@ func (m *Migrator) updateRegistriesToDBVersion18() error {
}
for _, registry := range legacyRegistries {
registry.UserAccessPolicies = make(portainer.UserAccessPolicies)
registry.UserAccessPolicies = make(database.UserAccessPolicies)
for _, userID := range registry.AuthorizedUsers {
registry.UserAccessPolicies[userID] = portainer.AccessPolicy{}
registry.UserAccessPolicies[userID] = database.AccessPolicy{}
}
registry.TeamAccessPolicies = make(portainer.TeamAccessPolicies)
registry.TeamAccessPolicies = make(database.TeamAccessPolicies)
for _, teamID := range registry.AuthorizedTeams {
registry.TeamAccessPolicies[teamID] = portainer.AccessPolicy{}
registry.TeamAccessPolicies[teamID] = database.AccessPolicy{}
}
err = m.registryService.UpdateRegistry(registry.ID, &registry)

View File

@@ -1,7 +1,7 @@
package migrator
import (
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/internal/authorization"
)
@@ -42,7 +42,7 @@ func (m *Migrator) updateUsersAndRolesToDBVersion22() error {
}
}
endpointAdministratorRole, err := m.roleService.Role(portainer.RoleID(1))
endpointAdministratorRole, err := m.roleService.Role(database.RoleID(1))
if err != nil {
return err
}
@@ -51,7 +51,7 @@ func (m *Migrator) updateUsersAndRolesToDBVersion22() error {
err = m.roleService.UpdateRole(endpointAdministratorRole.ID, endpointAdministratorRole)
helpDeskRole, err := m.roleService.Role(portainer.RoleID(2))
helpDeskRole, err := m.roleService.Role(database.RoleID(2))
if err != nil {
return err
}
@@ -60,7 +60,7 @@ func (m *Migrator) updateUsersAndRolesToDBVersion22() error {
err = m.roleService.UpdateRole(helpDeskRole.ID, helpDeskRole)
standardUserRole, err := m.roleService.Role(portainer.RoleID(3))
standardUserRole, err := m.roleService.Role(database.RoleID(3))
if err != nil {
return err
}
@@ -69,7 +69,7 @@ func (m *Migrator) updateUsersAndRolesToDBVersion22() error {
err = m.roleService.UpdateRole(standardUserRole.ID, standardUserRole)
readOnlyUserRole, err := m.roleService.Role(portainer.RoleID(4))
readOnlyUserRole, err := m.roleService.Role(database.RoleID(4))
if err != nil {
return err
}

View File

@@ -1,6 +1,9 @@
package migrator
import portainer "github.com/portainer/portainer/api"
import (
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
)
func (m *Migrator) updateTagsToDBVersion23() error {
migrateLog.Info("Updating tags")
@@ -11,7 +14,7 @@ func (m *Migrator) updateTagsToDBVersion23() error {
for _, tag := range tags {
tag.EndpointGroups = make(map[portainer.EndpointGroupID]bool)
tag.Endpoints = make(map[portainer.EndpointID]bool)
tag.Endpoints = make(map[database.EndpointID]bool)
err = m.tagService.UpdateTag(tag.ID, &tag)
if err != nil {
return err

View File

@@ -2,12 +2,14 @@ package migrator
import (
"fmt"
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/errors"
registry2 "github.com/portainer/portainer/api/dataservices/registry"
snapshotutils "github.com/portainer/portainer/api/orchestrators/snapshot"
"log"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/internal/endpointutils"
snapshotutils "github.com/portainer/portainer/api/internal/snapshot"
)
func (m *Migrator) migrateDBVersionToDB32() error {
@@ -54,25 +56,25 @@ func (m *Migrator) updateRegistriesToDB32() error {
for _, registry := range registries {
registry.RegistryAccesses = portainer.RegistryAccesses{}
registry.RegistryAccesses = registry2.RegistryAccesses{}
for _, endpoint := range endpoints {
filteredUserAccessPolicies := portainer.UserAccessPolicies{}
filteredUserAccessPolicies := database.UserAccessPolicies{}
for userId, registryPolicy := range registry.UserAccessPolicies {
if _, found := endpoint.UserAccessPolicies[userId]; found {
filteredUserAccessPolicies[userId] = registryPolicy
}
}
filteredTeamAccessPolicies := portainer.TeamAccessPolicies{}
filteredTeamAccessPolicies := database.TeamAccessPolicies{}
for teamId, registryPolicy := range registry.TeamAccessPolicies {
if _, found := endpoint.TeamAccessPolicies[teamId]; found {
filteredTeamAccessPolicies[teamId] = registryPolicy
}
}
registry.RegistryAccesses[endpoint.ID] = portainer.RegistryAccessPolicies{
registry.RegistryAccesses[endpoint.ID] = registry2.RegistryAccessPolicies{
UserAccessPolicies: filteredUserAccessPolicies,
TeamAccessPolicies: filteredTeamAccessPolicies,
Namespaces: []string{},
@@ -95,14 +97,14 @@ func (m *Migrator) updateDockerhubToDB32() error {
return nil
}
registry := &portainer.Registry{
registry := &registry2.Registry{
Type: portainer.DockerHubRegistry,
Name: "Dockerhub (authenticated - migrated)",
URL: "docker.io",
Authentication: true,
Username: dockerhub.Username,
Password: dockerhub.Password,
RegistryAccesses: portainer.RegistryAccesses{},
RegistryAccesses: registry2.RegistryAccesses{},
}
// The following code will make this function idempotent.
@@ -122,7 +124,7 @@ func (m *Migrator) updateDockerhubToDB32() error {
migrated = true
} else {
// delete subsequent duplicates
m.registryService.DeleteRegistry(portainer.RegistryID(r.ID))
m.registryService.DeleteRegistry(registry2.RegistryID(r.ID))
}
}
}
@@ -142,25 +144,25 @@ func (m *Migrator) updateDockerhubToDB32() error {
endpoint.Type != portainer.AgentOnKubernetesEnvironment &&
endpoint.Type != portainer.EdgeAgentOnKubernetesEnvironment {
userAccessPolicies := portainer.UserAccessPolicies{}
userAccessPolicies := database.UserAccessPolicies{}
for userId := range endpoint.UserAccessPolicies {
if _, found := endpoint.UserAccessPolicies[userId]; found {
userAccessPolicies[userId] = portainer.AccessPolicy{
userAccessPolicies[userId] = database.AccessPolicy{
RoleID: 0,
}
}
}
teamAccessPolicies := portainer.TeamAccessPolicies{}
teamAccessPolicies := database.TeamAccessPolicies{}
for teamId := range endpoint.TeamAccessPolicies {
if _, found := endpoint.TeamAccessPolicies[teamId]; found {
teamAccessPolicies[teamId] = portainer.AccessPolicy{
teamAccessPolicies[teamId] = database.AccessPolicy{
RoleID: 0,
}
}
}
registry.RegistryAccesses[endpoint.ID] = portainer.RegistryAccessPolicies{
registry.RegistryAccesses[endpoint.ID] = registry2.RegistryAccessPolicies{
UserAccessPolicies: userAccessPolicies,
TeamAccessPolicies: teamAccessPolicies,
Namespaces: []string{},

View File

@@ -2,6 +2,7 @@ package datastore
import (
"encoding/json"
"github.com/portainer/portainer/api/database"
"io/ioutil"
"strconv"
@@ -39,7 +40,7 @@ import (
// Store defines the implementation of portainer.DataStore using
// BoltDB as the storage system.
type Store struct {
connection portainer.Connection
connection database.Connection
fileService portainer.FileService
CustomTemplateService *customtemplate.Service
@@ -348,17 +349,17 @@ func (store *Store) Webhook() dataservices.WebhookService {
type storeExport struct {
CustomTemplate []portainer.CustomTemplate `json:"customtemplates,omitempty"`
EdgeGroup []portainer.EdgeGroup `json:"edgegroups,omitempty"`
EdgeJob []portainer.EdgeJob `json:"edgejobs,omitempty"`
EdgeJob []edgejob.EdgeJob `json:"edgejobs,omitempty"`
EdgeStack []portainer.EdgeStack `json:"edge_stack,omitempty"`
Endpoint []portainer.Endpoint `json:"endpoints,omitempty"`
EndpointGroup []portainer.EndpointGroup `json:"endpoint_groups,omitempty"`
EndpointRelation []portainer.EndpointRelation `json:"endpoint_relations,omitempty"`
Extensions []portainer.Extension `json:"extension,omitempty"`
HelmUserRepository []portainer.HelmUserRepository `json:"helm_user_repository,omitempty"`
Registry []portainer.Registry `json:"registries,omitempty"`
Registry []registry.Registry `json:"registries,omitempty"`
ResourceControl []portainer.ResourceControl `json:"resource_control,omitempty"`
Role []portainer.Role `json:"roles,omitempty"`
Schedules []portainer.Schedule `json:"schedules,omitempty"`
Schedules []schedule.Schedule `json:"schedules,omitempty"`
Settings portainer.Settings `json:"settings,omitempty"`
SSLSettings portainer.SSLSettings `json:"ssl,omitempty"`
Stack []portainer.Stack `json:"stacks,omitempty"`

View File

@@ -14,7 +14,7 @@ import (
var errTempDir = errors.New("can't create a temp dir")
func (store *Store) GetConnection() portainer.Connection {
func (store *Store) GetConnection() database.Connection {
return store.connection
}

View File

@@ -2,6 +2,7 @@ package exectest
import (
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
)
type kubernetesMockDeployer struct{}
@@ -10,11 +11,11 @@ func NewKubernetesDeployer() portainer.KubernetesDeployer {
return &kubernetesMockDeployer{}
}
func (deployer *kubernetesMockDeployer) Deploy(userID portainer.UserID, endpoint *portainer.Endpoint, manifestFiles []string, namespace string) (string, error) {
func (deployer *kubernetesMockDeployer) Deploy(userID database.UserID, endpoint *portainer.Endpoint, manifestFiles []string, namespace string) (string, error) {
return "", nil
}
func (deployer *kubernetesMockDeployer) Remove(userID portainer.UserID, endpoint *portainer.Endpoint, manifestFiles []string, namespace string) (string, error) {
func (deployer *kubernetesMockDeployer) Remove(userID database.UserID, endpoint *portainer.Endpoint, manifestFiles []string, namespace string) (string, error) {
return "", nil
}

View File

@@ -3,19 +3,19 @@ package exec
import (
"bytes"
"fmt"
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/orchestrators/kubernetes/cli"
"os/exec"
"path"
"runtime"
"strings"
"github.com/pkg/errors"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices"
"github.com/portainer/portainer/api/http/proxy"
"github.com/portainer/portainer/api/http/proxy/factory"
"github.com/portainer/portainer/api/http/proxy/factory/kubernetes"
"github.com/portainer/portainer/api/kubernetes/cli"
portainer "github.com/portainer/portainer/api"
)
// KubernetesDeployer represents a service to deploy resources inside a Kubernetes environment(endpoint).
@@ -42,7 +42,7 @@ func NewKubernetesDeployer(kubernetesTokenCacheManager *kubernetes.TokenCacheMan
}
}
func (deployer *KubernetesDeployer) getToken(userID portainer.UserID, endpoint *portainer.Endpoint, setLocalAdminToken bool) (string, error) {
func (deployer *KubernetesDeployer) getToken(userID database.UserID, endpoint *portainer.Endpoint, setLocalAdminToken bool) (string, error) {
kubeCLI, err := deployer.kubernetesClientFactory.GetKubeClient(endpoint)
if err != nil {
return "", err
@@ -76,16 +76,16 @@ func (deployer *KubernetesDeployer) getToken(userID portainer.UserID, endpoint *
}
// Deploy upserts Kubernetes resources defined in manifest(s)
func (deployer *KubernetesDeployer) Deploy(userID portainer.UserID, endpoint *portainer.Endpoint, manifestFiles []string, namespace string) (string, error) {
func (deployer *KubernetesDeployer) Deploy(userID database.UserID, endpoint *portainer.Endpoint, manifestFiles []string, namespace string) (string, error) {
return deployer.command("apply", userID, endpoint, manifestFiles, namespace)
}
// Remove deletes Kubernetes resources defined in manifest(s)
func (deployer *KubernetesDeployer) Remove(userID portainer.UserID, endpoint *portainer.Endpoint, manifestFiles []string, namespace string) (string, error) {
func (deployer *KubernetesDeployer) Remove(userID database.UserID, endpoint *portainer.Endpoint, manifestFiles []string, namespace string) (string, error) {
return deployer.command("delete", userID, endpoint, manifestFiles, namespace)
}
func (deployer *KubernetesDeployer) command(operation string, userID portainer.UserID, endpoint *portainer.Endpoint, manifestFiles []string, namespace string) (string, error) {
func (deployer *KubernetesDeployer) command(operation string, userID database.UserID, endpoint *portainer.Endpoint, manifestFiles []string, namespace string) (string, error) {
token, err := deployer.getToken(userID, endpoint, endpoint.Type == portainer.KubernetesLocalEnvironment)
if err != nil {
return "", errors.Wrap(err, "failed generating a user token")

View File

@@ -5,6 +5,7 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/portainer/portainer/api/dataservices/registry"
"os"
"os/exec"
"path"
@@ -54,7 +55,7 @@ func NewSwarmStackManager(
}
// Login executes the docker login command against a list of registries (including DockerHub).
func (manager *SwarmStackManager) Login(registries []portainer.Registry, endpoint *portainer.Endpoint) error {
func (manager *SwarmStackManager) Login(registries []registry.Registry, endpoint *portainer.Endpoint) error {
command, args, err := manager.prepareDockerCommandAndArgs(manager.binaryPath, manager.configPath, endpoint)
if err != nil {
return err

View File

@@ -38,6 +38,7 @@ require (
github.com/robfig/cron/v3 v3.0.1
github.com/sirupsen/logrus v1.8.1
github.com/stretchr/testify v1.7.0
github.com/swaggo/swag v1.8.0
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
@@ -50,6 +51,9 @@ require (
)
require (
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15 // indirect
github.com/andrew-d/go-termutil v0.0.0-20150726205930-009166a695a2 // indirect
@@ -70,6 +74,10 @@ require (
github.com/go-git/gcfg v1.5.0 // indirect
github.com/go-git/go-billy/v5 v5.1.0 // indirect
github.com/go-logr/logr v0.4.0 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.6 // indirect
github.com/go-openapi/spec v0.20.4 // indirect
github.com/go-openapi/swag v0.19.15 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/go-cmp v0.5.6 // indirect
@@ -79,10 +87,12 @@ require (
github.com/imdario/mergo v0.3.12 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/jpillora/ansi v0.0.0-20170202005112-f496b27cd669 // indirect
github.com/jpillora/requestlog v0.0.0-20181015073026-df8817be5f82 // indirect
github.com/jpillora/sizestr v0.0.0-20160130011556-e2ea2fa42fb9 // indirect
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.1.2 // indirect
github.com/moby/spdystream v0.2.0 // indirect
@@ -101,11 +111,12 @@ require (
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 // indirect
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 // indirect
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e // indirect
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect
golang.org/x/text v0.3.6 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
golang.org/x/tools v0.1.7 // indirect
google.golang.org/appengine v1.6.5 // indirect
google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a // indirect
google.golang.org/grpc v1.33.2 // indirect

View File

@@ -41,6 +41,8 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
@@ -62,7 +64,9 @@ github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5
github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
@@ -336,11 +340,19 @@ github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc=
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
@@ -473,6 +485,8 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/jpillora/ansi v0.0.0-20170202005112-f496b27cd669 h1:l5rH/CnVVu+HPxjtxjM90nHrm4nov3j3RF9/62UjgLs=
github.com/jpillora/ansi v0.0.0-20170202005112-f496b27cd669/go.mod h1:kOeLNvjNBGSV3uYtFjvb72+fnZCMFJF1XDvRIjdom0g=
github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0=
@@ -518,6 +532,8 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
@@ -705,6 +721,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/swaggo/swag v1.8.0 h1:80NNhvpJcuItNpBDqgJwDuKlMmaZ/OATOzhG3bhcM3w=
github.com/swaggo/swag v1.8.0/go.mod h1:gZ+TJ2w/Ve1RwQsA2IRoSOTidHz6DX+PIG8GWvbnoLU=
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
@@ -841,8 +859,11 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE=
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -922,10 +943,13 @@ golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
@@ -938,6 +962,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -982,6 +1008,8 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ=
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

View File

@@ -2,6 +2,7 @@ package auth
import (
"errors"
"github.com/portainer/portainer/api/database"
"log"
"net/http"
"strings"
@@ -197,7 +198,7 @@ func teamExists(teamName string, ldapGroups []string) bool {
return false
}
func teamMembershipExists(teamID portainer.TeamID, memberships []portainer.TeamMembership) bool {
func teamMembershipExists(teamID database.TeamID, memberships []portainer.TeamMembership) bool {
for _, membership := range memberships {
if membership.TeamID == teamID {
return true

View File

@@ -4,6 +4,7 @@ import (
"bytes"
"context"
"fmt"
"github.com/portainer/portainer/api/dataservices/edgejob"
"io"
"mime/multipart"
"net/http"
@@ -48,7 +49,7 @@ func Test_restoreArchive_usingCombinationOfPasswords(t *testing.T) {
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
datastore := i.NewDatastore(i.WithUsers([]portainer.User{}), i.WithEdgeJobs([]portainer.EdgeJob{}))
datastore := i.NewDatastore(i.WithUsers([]portainer.User{}), i.WithEdgeJobs([]edgejob.EdgeJob{}))
adminMonitor := adminmonitor.New(time.Hour, datastore, context.Background())
h := NewHandler(nil, datastore, offlinegate.NewOfflineGate(), "./test_assets/handler_test", func() {}, adminMonitor)
@@ -71,7 +72,7 @@ func Test_restoreArchive_shouldFailIfSystemWasAlreadyInitialized(t *testing.T) {
admin := portainer.User{
Role: portainer.AdministratorRole,
}
datastore := i.NewDatastore(i.WithUsers([]portainer.User{admin}), i.WithEdgeJobs([]portainer.EdgeJob{}))
datastore := i.NewDatastore(i.WithUsers([]portainer.User{admin}), i.WithEdgeJobs([]edgejob.EdgeJob{}))
adminMonitor := adminmonitor.New(time.Hour, datastore, context.Background())
h := NewHandler(nil, datastore, offlinegate.NewOfflineGate(), "./test_assets/handler_test", func() {}, adminMonitor)

View File

@@ -1,6 +1,7 @@
package customtemplates
import (
"github.com/portainer/portainer/api/database"
"net/http"
"strconv"
@@ -53,7 +54,7 @@ func (handler *Handler) customTemplateList(w http.ResponseWriter, r *http.Reques
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to retrieve user information from the database", err}
}
userTeamIDs := make([]portainer.TeamID, 0)
userTeamIDs := make([]database.TeamID, 0)
for _, membership := range securityContext.UserMemberships {
userTeamIDs = append(userTeamIDs, membership.TeamID)
}

View File

@@ -1,6 +1,7 @@
package customtemplates
import (
"github.com/portainer/portainer/api/database"
"net/http"
"github.com/gorilla/mux"
@@ -48,7 +49,7 @@ func userCanAccessTemplate(customTemplate portainer.CustomTemplate, securityCont
return true
}
userTeamIDs := make([]portainer.TeamID, 0)
userTeamIDs := make([]database.TeamID, 0)
for _, membership := range securityContext.UserMemberships {
userTeamIDs = append(userTeamIDs, membership.TeamID)
}

View File

@@ -2,13 +2,14 @@ package edgegroups
import (
"github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
)
type endpointSetType map[portainer.EndpointID]bool
type endpointSetType map[database.EndpointID]bool
func (handler *Handler) getEndpointsByTags(tagIDs []portainer.TagID, partialMatch bool) ([]portainer.EndpointID, error) {
func (handler *Handler) getEndpointsByTags(tagIDs []portainer.TagID, partialMatch bool) ([]database.EndpointID, error) {
if len(tagIDs) == 0 {
return []portainer.EndpointID{}, nil
return []database.EndpointID{}, nil
}
endpoints, err := handler.DataStore.Endpoint().Endpoints()
@@ -36,7 +37,7 @@ func (handler *Handler) getEndpointsByTags(tagIDs []portainer.TagID, partialMatc
endpointSet = setsIntersection(setsOfEndpoints)
}
results := []portainer.EndpointID{}
results := []database.EndpointID{}
for _, endpoint := range endpoints {
if _, ok := endpointSet[endpoint.ID]; ok && (endpoint.Type == portainer.EdgeAgentOnDockerEnvironment || endpoint.Type == portainer.EdgeAgentOnKubernetesEnvironment) {
results = append(results, endpoint.ID)

View File

@@ -2,6 +2,7 @@ package edgegroups
import (
"errors"
"github.com/portainer/portainer/api/database"
"net/http"
"github.com/asaskevich/govalidator"
@@ -15,7 +16,7 @@ type edgeGroupCreatePayload struct {
Name string
Dynamic bool
TagIDs []portainer.TagID
Endpoints []portainer.EndpointID
Endpoints []database.EndpointID
PartialMatch bool
}
@@ -67,14 +68,14 @@ func (handler *Handler) edgeGroupCreate(w http.ResponseWriter, r *http.Request)
Name: payload.Name,
Dynamic: payload.Dynamic,
TagIDs: []portainer.TagID{},
Endpoints: []portainer.EndpointID{},
Endpoints: []database.EndpointID{},
PartialMatch: payload.PartialMatch,
}
if edgeGroup.Dynamic {
edgeGroup.TagIDs = payload.TagIDs
} else {
endpointIDs := []portainer.EndpointID{}
endpointIDs := []database.EndpointID{}
for _, endpointID := range payload.Endpoints {
endpoint, err := handler.DataStore.Endpoint().Endpoint(endpointID)
if err != nil {

View File

@@ -2,6 +2,7 @@ package edgegroups
import (
"fmt"
"github.com/portainer/portainer/api/database"
"net/http"
httperror "github.com/portainer/libhttp/error"
@@ -76,7 +77,7 @@ func (handler *Handler) edgeGroupList(w http.ResponseWriter, r *http.Request) *h
return response.JSON(w, decoratedEdgeGroups)
}
func getEndpointTypes(endpointService dataservices.EndpointService, endpointIds []portainer.EndpointID) ([]portainer.EndpointType, error) {
func getEndpointTypes(endpointService dataservices.EndpointService, endpointIds []database.EndpointID) ([]portainer.EndpointType, error) {
typeSet := map[portainer.EndpointType]bool{}
for _, endpointID := range endpointIds {
endpoint, err := endpointService.Endpoint(endpointID)

View File

@@ -1,6 +1,7 @@
package edgegroups
import (
"github.com/portainer/portainer/api/database"
"testing"
portainer "github.com/portainer/portainer/api"
@@ -22,19 +23,19 @@ func Test_getEndpointTypes(t *testing.T) {
datastore := testhelpers.NewDatastore(testhelpers.WithEndpoints(endpoints))
tests := []struct {
endpointIds []portainer.EndpointID
endpointIds []database.EndpointID
expected []portainer.EndpointType
}{
{endpointIds: []portainer.EndpointID{1}, expected: []portainer.EndpointType{portainer.DockerEnvironment}},
{endpointIds: []portainer.EndpointID{2}, expected: []portainer.EndpointType{portainer.AgentOnDockerEnvironment}},
{endpointIds: []portainer.EndpointID{3}, expected: []portainer.EndpointType{portainer.AzureEnvironment}},
{endpointIds: []portainer.EndpointID{4}, expected: []portainer.EndpointType{portainer.EdgeAgentOnDockerEnvironment}},
{endpointIds: []portainer.EndpointID{5}, expected: []portainer.EndpointType{portainer.KubernetesLocalEnvironment}},
{endpointIds: []portainer.EndpointID{6}, expected: []portainer.EndpointType{portainer.AgentOnKubernetesEnvironment}},
{endpointIds: []portainer.EndpointID{7}, expected: []portainer.EndpointType{portainer.EdgeAgentOnKubernetesEnvironment}},
{endpointIds: []portainer.EndpointID{7, 2}, expected: []portainer.EndpointType{portainer.EdgeAgentOnKubernetesEnvironment, portainer.AgentOnDockerEnvironment}},
{endpointIds: []portainer.EndpointID{6, 4, 1}, expected: []portainer.EndpointType{portainer.AgentOnKubernetesEnvironment, portainer.EdgeAgentOnDockerEnvironment, portainer.DockerEnvironment}},
{endpointIds: []portainer.EndpointID{1, 2, 3}, expected: []portainer.EndpointType{portainer.DockerEnvironment, portainer.AgentOnDockerEnvironment, portainer.AzureEnvironment}},
{endpointIds: []database.EndpointID{1}, expected: []portainer.EndpointType{portainer.DockerEnvironment}},
{endpointIds: []database.EndpointID{2}, expected: []portainer.EndpointType{portainer.AgentOnDockerEnvironment}},
{endpointIds: []database.EndpointID{3}, expected: []portainer.EndpointType{portainer.AzureEnvironment}},
{endpointIds: []database.EndpointID{4}, expected: []portainer.EndpointType{portainer.EdgeAgentOnDockerEnvironment}},
{endpointIds: []database.EndpointID{5}, expected: []portainer.EndpointType{portainer.KubernetesLocalEnvironment}},
{endpointIds: []database.EndpointID{6}, expected: []portainer.EndpointType{portainer.AgentOnKubernetesEnvironment}},
{endpointIds: []database.EndpointID{7}, expected: []portainer.EndpointType{portainer.EdgeAgentOnKubernetesEnvironment}},
{endpointIds: []database.EndpointID{7, 2}, expected: []portainer.EndpointType{portainer.EdgeAgentOnKubernetesEnvironment, portainer.AgentOnDockerEnvironment}},
{endpointIds: []database.EndpointID{6, 4, 1}, expected: []portainer.EndpointType{portainer.AgentOnKubernetesEnvironment, portainer.EdgeAgentOnDockerEnvironment, portainer.DockerEnvironment}},
{endpointIds: []database.EndpointID{1, 2, 3}, expected: []portainer.EndpointType{portainer.DockerEnvironment, portainer.AgentOnDockerEnvironment, portainer.AzureEnvironment}},
}
for _, test := range tests {
@@ -48,6 +49,6 @@ func Test_getEndpointTypes(t *testing.T) {
func Test_getEndpointTypes_failWhenEndpointDontExist(t *testing.T) {
datastore := testhelpers.NewDatastore(testhelpers.WithEndpoints([]portainer.Endpoint{}))
_, err := getEndpointTypes(datastore.Endpoint(), []portainer.EndpointID{1})
_, err := getEndpointTypes(datastore.Endpoint(), []database.EndpointID{1})
assert.Error(t, err, "getEndpointTypes should fail")
}

View File

@@ -2,6 +2,7 @@ package edgegroups
import (
"errors"
"github.com/portainer/portainer/api/database"
"net/http"
"github.com/asaskevich/govalidator"
@@ -16,7 +17,7 @@ type edgeGroupUpdatePayload struct {
Name string
Dynamic bool
TagIDs []portainer.TagID
Endpoints []portainer.EndpointID
Endpoints []database.EndpointID
PartialMatch *bool
}
@@ -95,7 +96,7 @@ func (handler *Handler) edgeGroupUpdate(w http.ResponseWriter, r *http.Request)
if edgeGroup.Dynamic {
edgeGroup.TagIDs = payload.TagIDs
} else {
endpointIDs := []portainer.EndpointID{}
endpointIDs := []database.EndpointID{}
for _, endpointID := range payload.Endpoints {
endpoint, err := handler.DataStore.Endpoint().Endpoint(endpointID)
if err != nil {
@@ -131,7 +132,7 @@ func (handler *Handler) edgeGroupUpdate(w http.ResponseWriter, r *http.Request)
return response.JSON(w, edgeGroup)
}
func (handler *Handler) updateEndpoint(endpointID portainer.EndpointID) error {
func (handler *Handler) updateEndpoint(endpointID database.EndpointID) error {
relation, err := handler.DataStore.EndpointRelation().EndpointRelation(endpointID)
if err != nil {
return err

View File

@@ -2,6 +2,8 @@ package edgejobs
import (
"errors"
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/edgejob"
"net/http"
"strconv"
"strings"
@@ -48,7 +50,7 @@ type edgeJobCreateFromFileContentPayload struct {
Name string
CronExpression string
Recurring bool
Endpoints []portainer.EndpointID
Endpoints []database.EndpointID
FileContent string
}
@@ -97,7 +99,7 @@ type edgeJobCreateFromFilePayload struct {
Name string
CronExpression string
Recurring bool
Endpoints []portainer.EndpointID
Endpoints []database.EndpointID
File []byte
}
@@ -118,7 +120,7 @@ func (payload *edgeJobCreateFromFilePayload) Validate(r *http.Request) error {
}
payload.CronExpression = cronExpression
var endpoints []portainer.EndpointID
var endpoints []database.EndpointID
err = request.RetrieveMultiPartFormJSONValue(r, "Environments", &endpoints, false)
if err != nil {
return errors.New("Invalid environments")
@@ -151,12 +153,12 @@ func (handler *Handler) createEdgeJobFromFile(w http.ResponseWriter, r *http.Req
return response.JSON(w, edgeJob)
}
func (handler *Handler) createEdgeJobObjectFromFilePayload(payload *edgeJobCreateFromFilePayload) *portainer.EdgeJob {
edgeJobIdentifier := portainer.EdgeJobID(handler.DataStore.EdgeJob().GetNextIdentifier())
func (handler *Handler) createEdgeJobObjectFromFilePayload(payload *edgeJobCreateFromFilePayload) *edgejob.EdgeJob {
edgeJobIdentifier := edgejob.EdgeJobID(handler.DataStore.EdgeJob().GetNextIdentifier())
endpoints := convertEndpointsToMetaObject(payload.Endpoints)
edgeJob := &portainer.EdgeJob{
edgeJob := &edgejob.EdgeJob{
ID: edgeJobIdentifier,
Name: payload.Name,
CronExpression: payload.CronExpression,
@@ -169,12 +171,12 @@ func (handler *Handler) createEdgeJobObjectFromFilePayload(payload *edgeJobCreat
return edgeJob
}
func (handler *Handler) createEdgeJobObjectFromFileContentPayload(payload *edgeJobCreateFromFileContentPayload) *portainer.EdgeJob {
edgeJobIdentifier := portainer.EdgeJobID(handler.DataStore.EdgeJob().GetNextIdentifier())
func (handler *Handler) createEdgeJobObjectFromFileContentPayload(payload *edgeJobCreateFromFileContentPayload) *edgejob.EdgeJob {
edgeJobIdentifier := edgejob.EdgeJobID(handler.DataStore.EdgeJob().GetNextIdentifier())
endpoints := convertEndpointsToMetaObject(payload.Endpoints)
edgeJob := &portainer.EdgeJob{
edgeJob := &edgejob.EdgeJob{
ID: edgeJobIdentifier,
Name: payload.Name,
CronExpression: payload.CronExpression,
@@ -187,7 +189,7 @@ func (handler *Handler) createEdgeJobObjectFromFileContentPayload(payload *edgeJ
return edgeJob
}
func (handler *Handler) addAndPersistEdgeJob(edgeJob *portainer.EdgeJob, file []byte) error {
func (handler *Handler) addAndPersistEdgeJob(edgeJob *edgejob.EdgeJob, file []byte) error {
edgeCronExpression := strings.Split(edgeJob.CronExpression, " ")
if len(edgeCronExpression) == 6 {
edgeCronExpression = edgeCronExpression[1:]
@@ -222,11 +224,11 @@ func (handler *Handler) addAndPersistEdgeJob(edgeJob *portainer.EdgeJob, file []
return handler.DataStore.EdgeJob().Create(edgeJob)
}
func convertEndpointsToMetaObject(endpoints []portainer.EndpointID) map[portainer.EndpointID]portainer.EdgeJobEndpointMeta {
endpointsMap := map[portainer.EndpointID]portainer.EdgeJobEndpointMeta{}
func convertEndpointsToMetaObject(endpoints []database.EndpointID) map[database.EndpointID]edgejob.EdgeJobEndpointMeta {
endpointsMap := map[database.EndpointID]edgejob.EdgeJobEndpointMeta{}
for _, endpointID := range endpoints {
endpointsMap[endpointID] = portainer.EdgeJobEndpointMeta{}
endpointsMap[endpointID] = edgejob.EdgeJobEndpointMeta{}
}
return endpointsMap

View File

@@ -1,13 +1,13 @@
package edgejobs
import (
"github.com/portainer/portainer/api/dataservices/edgejob"
"net/http"
"strconv"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api"
)
// @id EdgeJobDelete
@@ -28,7 +28,7 @@ func (handler *Handler) edgeJobDelete(w http.ResponseWriter, r *http.Request) *h
return &httperror.HandlerError{http.StatusBadRequest, "Invalid Edge job identifier route variable", err}
}
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(portainer.EdgeJobID(edgeJobID))
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(edgejob.EdgeJobID(edgeJobID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an Edge job with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -1,12 +1,12 @@
package edgejobs
import (
"github.com/portainer/portainer/api/dataservices/edgejob"
"net/http"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api"
)
type edgeJobFileResponse struct {
@@ -32,7 +32,7 @@ func (handler *Handler) edgeJobFile(w http.ResponseWriter, r *http.Request) *htt
return &httperror.HandlerError{http.StatusBadRequest, "Invalid Edge job identifier route variable", err}
}
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(portainer.EdgeJobID(edgeJobID))
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(edgejob.EdgeJobID(edgeJobID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an Edge job with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -1,17 +1,18 @@
package edgejobs
import (
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/edgejob"
"net/http"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api"
)
type edgeJobInspectResponse struct {
*portainer.EdgeJob
Endpoints []portainer.EndpointID
*edgejob.EdgeJob
Endpoints []database.EndpointID
}
// @id EdgeJobInspect
@@ -33,14 +34,14 @@ func (handler *Handler) edgeJobInspect(w http.ResponseWriter, r *http.Request) *
return &httperror.HandlerError{http.StatusBadRequest, "Invalid Edge job identifier route variable", err}
}
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(portainer.EdgeJobID(edgeJobID))
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(edgejob.EdgeJobID(edgeJobID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an Edge job with the specified identifier inside the database", err}
} else if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to find an Edge job with the specified identifier inside the database", err}
}
endpointIDs := []portainer.EndpointID{}
endpointIDs := []database.EndpointID{}
for endpointID := range edgeJob.Endpoints {
endpointIDs = append(endpointIDs, endpointID)

View File

@@ -1,6 +1,8 @@
package edgejobs
import (
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/edgejob"
"net/http"
"strconv"
@@ -35,14 +37,14 @@ func (handler *Handler) edgeJobTasksClear(w http.ResponseWriter, r *http.Request
return &httperror.HandlerError{http.StatusBadRequest, "Invalid Task identifier route variable", err}
}
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(portainer.EdgeJobID(edgeJobID))
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(edgejob.EdgeJobID(edgeJobID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an Edge job with the specified identifier inside the database", err}
} else if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to find an Edge job with the specified identifier inside the database", err}
}
endpointID := portainer.EndpointID(taskID)
endpointID := database.EndpointID(taskID)
meta := edgeJob.Endpoints[endpointID]
meta.CollectLogs = false

View File

@@ -1,6 +1,8 @@
package edgejobs
import (
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/edgejob"
"net/http"
httperror "github.com/portainer/libhttp/error"
@@ -34,14 +36,14 @@ func (handler *Handler) edgeJobTasksCollect(w http.ResponseWriter, r *http.Reque
return &httperror.HandlerError{http.StatusBadRequest, "Invalid Task identifier route variable", err}
}
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(portainer.EdgeJobID(edgeJobID))
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(edgejob.EdgeJobID(edgeJobID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an Edge job with the specified identifier inside the database", err}
} else if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to find an Edge job with the specified identifier inside the database", err}
}
endpointID := portainer.EndpointID(taskID)
endpointID := database.EndpointID(taskID)
meta := edgeJob.Endpoints[endpointID]
meta.CollectLogs = true

View File

@@ -2,18 +2,19 @@ package edgejobs
import (
"fmt"
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/edgejob"
"net/http"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api"
)
type taskContainer struct {
ID string `json:"Id"`
EndpointID portainer.EndpointID `json:"EndpointId"`
LogsStatus portainer.EdgeJobLogsStatus `json:"LogsStatus"`
ID string `json:"Id"`
EndpointID database.EndpointID `json:"EndpointId"`
LogsStatus edgejob.EdgeJobLogsStatus `json:"LogsStatus"`
}
// @id EdgeJobTasksList
@@ -35,7 +36,7 @@ func (handler *Handler) edgeJobTasksList(w http.ResponseWriter, r *http.Request)
return &httperror.HandlerError{http.StatusBadRequest, "Invalid Edge job identifier route variable", err}
}
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(portainer.EdgeJobID(edgeJobID))
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(edgejob.EdgeJobID(edgeJobID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an Edge job with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -2,6 +2,8 @@ package edgejobs
import (
"errors"
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/edgejob"
"net/http"
"strconv"
@@ -16,7 +18,7 @@ type edgeJobUpdatePayload struct {
Name *string
CronExpression *string
Recurring *bool
Endpoints []portainer.EndpointID
Endpoints []database.EndpointID
FileContent *string
}
@@ -54,7 +56,7 @@ func (handler *Handler) edgeJobUpdate(w http.ResponseWriter, r *http.Request) *h
return &httperror.HandlerError{http.StatusBadRequest, "Invalid request payload", err}
}
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(portainer.EdgeJobID(edgeJobID))
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(edgejob.EdgeJobID(edgeJobID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an Edge job with the specified identifier inside the database", err}
} else if err != nil {
@@ -74,13 +76,13 @@ func (handler *Handler) edgeJobUpdate(w http.ResponseWriter, r *http.Request) *h
return response.JSON(w, edgeJob)
}
func (handler *Handler) updateEdgeSchedule(edgeJob *portainer.EdgeJob, payload *edgeJobUpdatePayload) error {
func (handler *Handler) updateEdgeSchedule(edgeJob *edgejob.EdgeJob, payload *edgeJobUpdatePayload) error {
if payload.Name != nil {
edgeJob.Name = *payload.Name
}
if payload.Endpoints != nil {
endpointsMap := map[portainer.EndpointID]portainer.EdgeJobEndpointMeta{}
endpointsMap := map[database.EndpointID]edgejob.EdgeJobEndpointMeta{}
for _, endpointID := range payload.Endpoints {
endpoint, err := handler.DataStore.Endpoint().Endpoint(endpointID)
@@ -95,7 +97,7 @@ func (handler *Handler) updateEdgeSchedule(edgeJob *portainer.EdgeJob, payload *
if meta, ok := edgeJob.Endpoints[endpointID]; ok {
endpointsMap[endpointID] = meta
} else {
endpointsMap[endpointID] = portainer.EdgeJobEndpointMeta{}
endpointsMap[endpointID] = edgejob.EdgeJobEndpointMeta{}
}
}

View File

@@ -3,6 +3,7 @@ package edgestacks
import (
"errors"
"fmt"
"github.com/portainer/portainer/api/database"
"net/http"
"strconv"
"strings"
@@ -105,7 +106,7 @@ func (handler *Handler) createSwarmStackFromFileContent(r *http.Request) (*porta
DeploymentType: payload.DeploymentType,
CreationDate: time.Now().Unix(),
EdgeGroups: payload.EdgeGroups,
Status: make(map[portainer.EndpointID]portainer.EdgeStackStatus),
Status: make(map[database.EndpointID]portainer.EdgeStackStatus),
Version: 1,
}
@@ -228,7 +229,7 @@ func (handler *Handler) createSwarmStackFromGitRepository(r *http.Request) (*por
Name: payload.Name,
CreationDate: time.Now().Unix(),
EdgeGroups: payload.EdgeGroups,
Status: make(map[portainer.EndpointID]portainer.EdgeStackStatus),
Status: make(map[database.EndpointID]portainer.EdgeStackStatus),
DeploymentType: payload.DeploymentType,
Version: 1,
}
@@ -337,7 +338,7 @@ func (handler *Handler) createSwarmStackFromFileUpload(r *http.Request) (*portai
DeploymentType: payload.DeploymentType,
CreationDate: time.Now().Unix(),
EdgeGroups: payload.EdgeGroups,
Status: make(map[portainer.EndpointID]portainer.EdgeStackStatus),
Status: make(map[database.EndpointID]portainer.EdgeStackStatus),
Version: 1,
}
@@ -404,7 +405,7 @@ func (handler *Handler) validateUniqueName(name string) error {
}
// updateEndpointRelations adds a relation between the Edge Stack to the related environments(endpoints)
func updateEndpointRelations(endpointRelationService dataservices.EndpointRelationService, edgeStackID portainer.EdgeStackID, relatedEndpointIds []portainer.EndpointID) error {
func updateEndpointRelations(endpointRelationService dataservices.EndpointRelationService, edgeStackID portainer.EdgeStackID, relatedEndpointIds []database.EndpointID) error {
for _, endpointID := range relatedEndpointIds {
relation, err := endpointRelationService.EndpointRelation(endpointID)
if err != nil {

View File

@@ -1,6 +1,7 @@
package edgestacks
import (
"github.com/portainer/portainer/api/database"
"testing"
portainer "github.com/portainer/portainer/api"
@@ -18,7 +19,7 @@ func Test_updateEndpointRelation_successfulRuns(t *testing.T) {
{EndpointID: 5, EdgeStacks: map[portainer.EdgeStackID]bool{}},
}
relatedIds := []portainer.EndpointID{2, 3}
relatedIds := []database.EndpointID{2, 3}
dataStore := testhelpers.NewDatastore(testhelpers.WithEndpointRelations(endpointRelations))
@@ -26,7 +27,7 @@ func Test_updateEndpointRelation_successfulRuns(t *testing.T) {
assert.NoError(t, err, "updateEndpointRelations should not fail")
relatedSet := map[portainer.EndpointID]bool{}
relatedSet := map[database.EndpointID]bool{}
for _, relationID := range relatedIds {
relatedSet[relationID] = true
}

View File

@@ -2,6 +2,7 @@ package edgestacks
import (
"errors"
"github.com/portainer/portainer/api/database"
"net/http"
"github.com/asaskevich/govalidator"
@@ -14,7 +15,7 @@ import (
type updateStatusPayload struct {
Error string
Status *portainer.EdgeStackStatusType
EndpointID *portainer.EndpointID
EndpointID *database.EndpointID
}
func (payload *updateStatusPayload) Validate(r *http.Request) error {
@@ -62,7 +63,7 @@ func (handler *Handler) edgeStackStatusUpdate(w http.ResponseWriter, r *http.Req
return &httperror.HandlerError{http.StatusBadRequest, "Invalid request payload", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(*payload.EndpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(*payload.EndpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -2,6 +2,7 @@ package edgestacks
import (
"errors"
"github.com/portainer/portainer/api/database"
"net/http"
"strconv"
@@ -83,7 +84,7 @@ func (handler *Handler) edgeStackUpdate(w http.ResponseWriter, r *http.Request)
oldRelatedSet := EndpointSet(relatedEndpointIds)
newRelatedSet := EndpointSet(newRelated)
endpointsToRemove := map[portainer.EndpointID]bool{}
endpointsToRemove := map[database.EndpointID]bool{}
for endpointID := range oldRelatedSet {
if !newRelatedSet[endpointID] {
endpointsToRemove[endpointID] = true
@@ -104,7 +105,7 @@ func (handler *Handler) edgeStackUpdate(w http.ResponseWriter, r *http.Request)
}
}
endpointsToAdd := map[portainer.EndpointID]bool{}
endpointsToAdd := map[database.EndpointID]bool{}
for endpointID := range newRelatedSet {
if !oldRelatedSet[endpointID] {
endpointsToAdd[endpointID] = true
@@ -179,7 +180,7 @@ func (handler *Handler) edgeStackUpdate(w http.ResponseWriter, r *http.Request)
if payload.Version != nil && *payload.Version != stack.Version {
stack.Version = *payload.Version
stack.Status = map[portainer.EndpointID]portainer.EdgeStackStatus{}
stack.Status = map[database.EndpointID]portainer.EdgeStackStatus{}
}
err = handler.DataStore.EdgeStack().UpdateEdgeStack(stack.ID, stack)
@@ -190,8 +191,8 @@ func (handler *Handler) edgeStackUpdate(w http.ResponseWriter, r *http.Request)
return response.JSON(w, stack)
}
func EndpointSet(endpointIDs []portainer.EndpointID) map[portainer.EndpointID]bool {
set := map[portainer.EndpointID]bool{}
func EndpointSet(endpointIDs []database.EndpointID) map[database.EndpointID]bool {
set := map[database.EndpointID]bool{}
for _, endpointID := range endpointIDs {
set[endpointID] = true

View File

@@ -2,21 +2,22 @@ package edgestacks
import (
"fmt"
"github.com/portainer/portainer/api/database"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices"
"github.com/portainer/portainer/api/internal/endpointutils"
)
func hasKubeEndpoint(endpointService dataservices.EndpointService, endpointIDs []portainer.EndpointID) (bool, error) {
func hasKubeEndpoint(endpointService dataservices.EndpointService, endpointIDs []database.EndpointID) (bool, error) {
return hasEndpointPredicate(endpointService, endpointIDs, endpointutils.IsKubernetesEndpoint)
}
func hasDockerEndpoint(endpointService dataservices.EndpointService, endpointIDs []portainer.EndpointID) (bool, error) {
func hasDockerEndpoint(endpointService dataservices.EndpointService, endpointIDs []database.EndpointID) (bool, error) {
return hasEndpointPredicate(endpointService, endpointIDs, endpointutils.IsDockerEndpoint)
}
func hasEndpointPredicate(endpointService dataservices.EndpointService, endpointIDs []portainer.EndpointID, predicate func(*portainer.Endpoint) bool) (bool, error) {
func hasEndpointPredicate(endpointService dataservices.EndpointService, endpointIDs []database.EndpointID, predicate func(*portainer.Endpoint) bool) (bool, error) {
for _, endpointID := range endpointIDs {
endpoint, err := endpointService.Endpoint(endpointID)
if err != nil {

View File

@@ -1,6 +1,7 @@
package edgestacks
import (
"github.com/portainer/portainer/api/database"
"testing"
portainer "github.com/portainer/portainer/api"
@@ -22,19 +23,19 @@ func Test_hasKubeEndpoint(t *testing.T) {
datastore := testhelpers.NewDatastore(testhelpers.WithEndpoints(endpoints))
tests := []struct {
endpointIds []portainer.EndpointID
endpointIds []database.EndpointID
expected bool
}{
{endpointIds: []portainer.EndpointID{1}, expected: false},
{endpointIds: []portainer.EndpointID{2}, expected: false},
{endpointIds: []portainer.EndpointID{3}, expected: false},
{endpointIds: []portainer.EndpointID{4}, expected: false},
{endpointIds: []portainer.EndpointID{5}, expected: true},
{endpointIds: []portainer.EndpointID{6}, expected: true},
{endpointIds: []portainer.EndpointID{7}, expected: true},
{endpointIds: []portainer.EndpointID{7, 2}, expected: true},
{endpointIds: []portainer.EndpointID{6, 4, 1}, expected: true},
{endpointIds: []portainer.EndpointID{1, 2, 3}, expected: false},
{endpointIds: []database.EndpointID{1}, expected: false},
{endpointIds: []database.EndpointID{2}, expected: false},
{endpointIds: []database.EndpointID{3}, expected: false},
{endpointIds: []database.EndpointID{4}, expected: false},
{endpointIds: []database.EndpointID{5}, expected: true},
{endpointIds: []database.EndpointID{6}, expected: true},
{endpointIds: []database.EndpointID{7}, expected: true},
{endpointIds: []database.EndpointID{7, 2}, expected: true},
{endpointIds: []database.EndpointID{6, 4, 1}, expected: true},
{endpointIds: []database.EndpointID{1, 2, 3}, expected: false},
}
for _, test := range tests {
@@ -49,7 +50,7 @@ func Test_hasKubeEndpoint(t *testing.T) {
func Test_hasKubeEndpoint_failWhenEndpointDontExist(t *testing.T) {
datastore := testhelpers.NewDatastore(testhelpers.WithEndpoints([]portainer.Endpoint{}))
_, err := hasKubeEndpoint(datastore.Endpoint(), []portainer.EndpointID{1})
_, err := hasKubeEndpoint(datastore.Endpoint(), []database.EndpointID{1})
assert.Error(t, err, "hasKubeEndpoint should fail")
}
@@ -67,19 +68,19 @@ func Test_hasDockerEndpoint(t *testing.T) {
datastore := testhelpers.NewDatastore(testhelpers.WithEndpoints(endpoints))
tests := []struct {
endpointIds []portainer.EndpointID
endpointIds []database.EndpointID
expected bool
}{
{endpointIds: []portainer.EndpointID{1}, expected: true},
{endpointIds: []portainer.EndpointID{2}, expected: true},
{endpointIds: []portainer.EndpointID{3}, expected: false},
{endpointIds: []portainer.EndpointID{4}, expected: true},
{endpointIds: []portainer.EndpointID{5}, expected: false},
{endpointIds: []portainer.EndpointID{6}, expected: false},
{endpointIds: []portainer.EndpointID{7}, expected: false},
{endpointIds: []portainer.EndpointID{7, 2}, expected: true},
{endpointIds: []portainer.EndpointID{6, 4, 1}, expected: true},
{endpointIds: []portainer.EndpointID{1, 2, 3}, expected: true},
{endpointIds: []database.EndpointID{1}, expected: true},
{endpointIds: []database.EndpointID{2}, expected: true},
{endpointIds: []database.EndpointID{3}, expected: false},
{endpointIds: []database.EndpointID{4}, expected: true},
{endpointIds: []database.EndpointID{5}, expected: false},
{endpointIds: []database.EndpointID{6}, expected: false},
{endpointIds: []database.EndpointID{7}, expected: false},
{endpointIds: []database.EndpointID{7, 2}, expected: true},
{endpointIds: []database.EndpointID{6, 4, 1}, expected: true},
{endpointIds: []database.EndpointID{1, 2, 3}, expected: true},
}
for _, test := range tests {
@@ -94,6 +95,6 @@ func Test_hasDockerEndpoint(t *testing.T) {
func Test_hasDockerEndpoint_failWhenEndpointDontExist(t *testing.T) {
datastore := testhelpers.NewDatastore(testhelpers.WithEndpoints([]portainer.Endpoint{}))
_, err := hasDockerEndpoint(datastore.Endpoint(), []portainer.EndpointID{1})
_, err := hasDockerEndpoint(datastore.Endpoint(), []database.EndpointID{1})
assert.Error(t, err, "hasDockerEndpoint should fail")
}

View File

@@ -2,6 +2,7 @@ package edgestacks
import (
"fmt"
"github.com/portainer/portainer/api/database"
"net/http"
"strconv"
@@ -46,7 +47,7 @@ func NewHandler(bouncer *security.RequestBouncer) *Handler {
return h
}
func (handler *Handler) convertAndStoreKubeManifestIfNeeded(edgeStack *portainer.EdgeStack, relatedEndpointIds []portainer.EndpointID) error {
func (handler *Handler) convertAndStoreKubeManifestIfNeeded(edgeStack *portainer.EdgeStack, relatedEndpointIds []database.EndpointID) error {
hasKubeEndpoint, err := hasKubeEndpoint(handler.DataStore.Endpoint(), relatedEndpointIds)
if err != nil {
return fmt.Errorf("unable to check if edge stack has kube environments: %w", err)

View File

@@ -1,6 +1,8 @@
package endpointedge
import (
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/edgejob"
"net/http"
"strconv"
@@ -36,7 +38,7 @@ func (handler *Handler) endpointEdgeJobsLogs(w http.ResponseWriter, r *http.Requ
return &httperror.HandlerError{http.StatusBadRequest, "Invalid environment identifier route variable", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {
@@ -59,7 +61,7 @@ func (handler *Handler) endpointEdgeJobsLogs(w http.ResponseWriter, r *http.Requ
return &httperror.HandlerError{http.StatusBadRequest, "Invalid request payload", err}
}
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(portainer.EdgeJobID(edgeJobID))
edgeJob, err := handler.DataStore.EdgeJob().EdgeJob(edgejob.EdgeJobID(edgeJobID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an edge job with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -2,6 +2,7 @@ package endpointedge
import (
"errors"
"github.com/portainer/portainer/api/database"
"net/http"
httperror "github.com/portainer/libhttp/error"
@@ -34,7 +35,7 @@ func (handler *Handler) endpointEdgeStackInspect(w http.ResponseWriter, r *http.
return &httperror.HandlerError{http.StatusBadRequest, "Invalid environment identifier route variable", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -2,6 +2,7 @@ package endpointgroups
import (
"errors"
"github.com/portainer/portainer/api/database"
"net/http"
"github.com/asaskevich/govalidator"
@@ -17,7 +18,7 @@ type endpointGroupCreatePayload struct {
// Environment(Endpoint) group description
Description string `example:"description"`
// List of environment(endpoint) identifiers that will be part of this group
AssociatedEndpoints []portainer.EndpointID `example:"1,3"`
AssociatedEndpoints []database.EndpointID `example:"1,3"`
// List of tag identifiers to which this environment(endpoint) group is associated
TagIDs []portainer.TagID `example:"1,2"`
}
@@ -55,8 +56,8 @@ func (handler *Handler) endpointGroupCreate(w http.ResponseWriter, r *http.Reque
endpointGroup := &portainer.EndpointGroup{
Name: payload.Name,
Description: payload.Description,
UserAccessPolicies: portainer.UserAccessPolicies{},
TeamAccessPolicies: portainer.TeamAccessPolicies{},
UserAccessPolicies: database.UserAccessPolicies{},
TeamAccessPolicies: database.TeamAccessPolicies{},
TagIDs: payload.TagIDs,
}

View File

@@ -1,6 +1,7 @@
package endpointgroups
import (
"github.com/portainer/portainer/api/database"
"net/http"
httperror "github.com/portainer/libhttp/error"
@@ -41,7 +42,7 @@ func (handler *Handler) endpointGroupAddEndpoint(w http.ResponseWriter, r *http.
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to find an environment group with the specified identifier inside the database", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -1,6 +1,7 @@
package endpointgroups
import (
"github.com/portainer/portainer/api/database"
"net/http"
httperror "github.com/portainer/libhttp/error"
@@ -40,7 +41,7 @@ func (handler *Handler) endpointGroupDeleteEndpoint(w http.ResponseWriter, r *ht
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to find an environment group with the specified identifier inside the database", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -1,6 +1,7 @@
package endpointgroups
import (
"github.com/portainer/portainer/api/database"
"net/http"
"reflect"
@@ -18,8 +19,8 @@ type endpointGroupUpdatePayload struct {
Description string `example:"description"`
// List of tag identifiers associated to the environment(endpoint) group
TagIDs []portainer.TagID `example:"3,4"`
UserAccessPolicies portainer.UserAccessPolicies
TeamAccessPolicies portainer.TeamAccessPolicies
UserAccessPolicies database.UserAccessPolicies
TeamAccessPolicies database.TeamAccessPolicies
}
func (payload *endpointGroupUpdatePayload) Validate(r *http.Request) error {

View File

@@ -1,12 +1,11 @@
package endpointproxy
import (
"github.com/portainer/portainer/api/database"
"strconv"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
portainer "github.com/portainer/portainer/api"
"net/http"
)
@@ -16,7 +15,7 @@ func (handler *Handler) proxyRequestsToAzureAPI(w http.ResponseWriter, r *http.R
return &httperror.HandlerError{http.StatusBadRequest, "Invalid environment identifier route variable", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -5,6 +5,7 @@ import (
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
"strconv"
"strings"
@@ -17,7 +18,7 @@ func (handler *Handler) proxyRequestsToDockerAPI(w http.ResponseWriter, r *http.
return &httperror.HandlerError{http.StatusBadRequest, "Invalid environment identifier route variable", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -6,6 +6,7 @@ import (
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database"
"strings"
"net/http"
@@ -17,7 +18,7 @@ func (handler *Handler) proxyRequestsToKubernetesAPI(w http.ResponseWriter, r *h
return &httperror.HandlerError{http.StatusBadRequest, "Invalid environment identifier route variable", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -4,6 +4,7 @@ import (
"encoding/base64"
"errors"
"fmt"
"github.com/portainer/portainer/api/database"
"net/http"
"regexp"
"strings"
@@ -34,7 +35,7 @@ func (handler *Handler) endpointAssociationDelete(w http.ResponseWriter, r *http
return &httperror.HandlerError{http.StatusBadRequest, "Invalid environment identifier route variable", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {
@@ -54,7 +55,7 @@ func (handler *Handler) endpointAssociationDelete(w http.ResponseWriter, r *http
return &httperror.HandlerError{http.StatusInternalServerError, "Invalid EdgeKey", err}
}
err = handler.DataStore.Endpoint().UpdateEndpoint(portainer.EndpointID(endpointID), endpoint)
err = handler.DataStore.Endpoint().UpdateEndpoint(database.EndpointID(endpointID), endpoint)
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Failed persisting environment in database", err}
}

View File

@@ -3,6 +3,7 @@ package endpoints
import (
"errors"
"fmt"
"github.com/portainer/portainer/api/database"
"net"
"net/http"
"net/url"
@@ -274,24 +275,16 @@ func (handler *Handler) createAzureEndpoint(payload *endpointCreatePayload) (*po
return nil, &httperror.HandlerError{http.StatusInternalServerError, "Unable to authenticate against Azure", err}
}
endpointID := handler.DataStore.Endpoint().GetNextIdentifier()
endpoint := &portainer.Endpoint{
ID: portainer.EndpointID(endpointID),
Name: payload.Name,
URL: "https://management.azure.com",
Type: portainer.AzureEnvironment,
GroupID: portainer.EndpointGroupID(payload.GroupID),
PublicURL: payload.PublicURL,
UserAccessPolicies: portainer.UserAccessPolicies{},
TeamAccessPolicies: portainer.TeamAccessPolicies{},
AzureCredentials: credentials,
TagIDs: payload.TagIDs,
Status: portainer.EndpointStatusUp,
Snapshots: []portainer.DockerSnapshot{},
Kubernetes: portainer.KubernetesDefault(),
}
endpoint := handler.DataStore.Endpoint().NewDefault()
endpoint.Name = payload.Name
endpoint.URL = "https://management.azure.com"
endpoint.GroupID = portainer.EndpointGroupID(payload.GroupID)
endpoint.Type = portainer.AzureEnvironment
endpoint.PublicURL = payload.PublicURL
endpoint.AzureCredentials = credentials
endpoint.TagIDs = payload.TagIDs
err = handler.saveEndpointAndUpdateAuthorizations(endpoint)
err = handler.saveEndpoint(endpoint)
if err != nil {
return nil, &httperror.HandlerError{http.StatusInternalServerError, "An error occured while trying to create the environment", err}
}
@@ -300,8 +293,6 @@ func (handler *Handler) createAzureEndpoint(payload *endpointCreatePayload) (*po
}
func (handler *Handler) createEdgeAgentEndpoint(payload *endpointCreatePayload) (*portainer.Endpoint, *httperror.HandlerError) {
endpointID := handler.DataStore.Endpoint().GetNextIdentifier()
portainerURL, err := url.Parse(payload.URL)
if err != nil {
return nil, &httperror.HandlerError{http.StatusBadRequest, "Invalid environment URL", err}
@@ -316,27 +307,17 @@ func (handler *Handler) createEdgeAgentEndpoint(payload *endpointCreatePayload)
return nil, &httperror.HandlerError{http.StatusBadRequest, "Invalid environment URL", errors.New("cannot use localhost as environment URL")}
}
edgeKey := handler.ReverseTunnelService.GenerateEdgeKey(payload.URL, portainerHost, endpointID)
endpoint := &portainer.Endpoint{
ID: portainer.EndpointID(endpointID),
Name: payload.Name,
URL: portainerHost,
Type: portainer.EdgeAgentOnDockerEnvironment,
GroupID: portainer.EndpointGroupID(payload.GroupID),
TLSConfig: portainer.TLSConfiguration{
TLS: false,
},
UserAccessPolicies: portainer.UserAccessPolicies{},
TeamAccessPolicies: portainer.TeamAccessPolicies{},
TagIDs: payload.TagIDs,
Status: portainer.EndpointStatusUp,
Snapshots: []portainer.DockerSnapshot{},
EdgeKey: edgeKey,
EdgeCheckinInterval: payload.EdgeCheckinInterval,
Kubernetes: portainer.KubernetesDefault(),
IsEdgeDevice: payload.IsEdgeDevice,
endpoint := handler.DataStore.Endpoint().NewDefault()
endpoint.Name = payload.Name
endpoint.URL = portainerHost
endpoint.GroupID = portainer.EndpointGroupID(payload.GroupID)
endpoint.Type = portainer.EdgeAgentOnDockerEnvironment
endpoint.PublicURL = payload.PublicURL
endpoint.TagIDs = payload.TagIDs
endpoint.TLSConfig = database.TLSConfiguration{
TLS: false,
}
endpoint.IsEdgeDevice = payload.IsEdgeDevice
settings, err := handler.DataStore.Settings().Settings()
if err != nil {
@@ -352,7 +333,14 @@ func (handler *Handler) createEdgeAgentEndpoint(payload *endpointCreatePayload)
endpoint.EdgeID = edgeID.String()
}
err = handler.saveEndpointAndUpdateAuthorizations(endpoint)
err = handler.saveEndpoint(endpoint)
if err != nil {
return nil, &httperror.HandlerError{http.StatusInternalServerError, "An error occured while trying to create the environment", err}
}
// TODO: this value is static, and calculatable - why store it?
endpoint.EdgeKey = handler.ReverseTunnelService.GenerateEdgeKey(payload.URL, portainerHost, int(endpoint.ID))
err = handler.DataStore.Endpoint().UpdateEndpoint(endpoint.ID, endpoint)
if err != nil {
return nil, &httperror.HandlerError{http.StatusInternalServerError, "An error occured while trying to create the environment", err}
}
@@ -361,8 +349,6 @@ func (handler *Handler) createEdgeAgentEndpoint(payload *endpointCreatePayload)
}
func (handler *Handler) createUnsecuredEndpoint(payload *endpointCreatePayload) (*portainer.Endpoint, *httperror.HandlerError) {
endpointType := portainer.DockerEnvironment
if payload.URL == "" {
payload.URL = "unix:///var/run/docker.sock"
if runtime.GOOS == "windows" {
@@ -370,25 +356,17 @@ func (handler *Handler) createUnsecuredEndpoint(payload *endpointCreatePayload)
}
}
endpointID := handler.DataStore.Endpoint().GetNextIdentifier()
endpoint := &portainer.Endpoint{
ID: portainer.EndpointID(endpointID),
Name: payload.Name,
URL: payload.URL,
Type: endpointType,
GroupID: portainer.EndpointGroupID(payload.GroupID),
PublicURL: payload.PublicURL,
TLSConfig: portainer.TLSConfiguration{
TLS: false,
},
UserAccessPolicies: portainer.UserAccessPolicies{},
TeamAccessPolicies: portainer.TeamAccessPolicies{},
TagIDs: payload.TagIDs,
Status: portainer.EndpointStatusUp,
Snapshots: []portainer.DockerSnapshot{},
Kubernetes: portainer.KubernetesDefault(),
IsEdgeDevice: payload.IsEdgeDevice,
endpoint := handler.DataStore.Endpoint().NewDefault()
endpoint.Name = payload.Name
endpoint.URL = payload.URL
endpoint.GroupID = portainer.EndpointGroupID(payload.GroupID)
endpoint.Type = portainer.DockerEnvironment
endpoint.PublicURL = payload.PublicURL
endpoint.TagIDs = payload.TagIDs
endpoint.TLSConfig = database.TLSConfiguration{
TLS: false,
}
endpoint.IsEdgeDevice = payload.IsEdgeDevice
err := handler.snapshotAndPersistEndpoint(endpoint)
if err != nil {
@@ -403,25 +381,16 @@ func (handler *Handler) createKubernetesEndpoint(payload *endpointCreatePayload)
payload.URL = "https://kubernetes.default.svc"
}
endpointID := handler.DataStore.Endpoint().GetNextIdentifier()
endpoint := &portainer.Endpoint{
ID: portainer.EndpointID(endpointID),
Name: payload.Name,
URL: payload.URL,
Type: portainer.KubernetesLocalEnvironment,
GroupID: portainer.EndpointGroupID(payload.GroupID),
PublicURL: payload.PublicURL,
TLSConfig: portainer.TLSConfiguration{
TLS: payload.TLS,
TLSSkipVerify: payload.TLSSkipVerify,
},
UserAccessPolicies: portainer.UserAccessPolicies{},
TeamAccessPolicies: portainer.TeamAccessPolicies{},
TagIDs: payload.TagIDs,
Status: portainer.EndpointStatusUp,
Snapshots: []portainer.DockerSnapshot{},
Kubernetes: portainer.KubernetesDefault(),
endpoint := handler.DataStore.Endpoint().NewDefault()
endpoint.Name = payload.Name
endpoint.URL = payload.URL
endpoint.GroupID = portainer.EndpointGroupID(payload.GroupID)
endpoint.Type = portainer.KubernetesLocalEnvironment
endpoint.PublicURL = payload.PublicURL
endpoint.TagIDs = payload.TagIDs
endpoint.TLSConfig = database.TLSConfiguration{
TLS: payload.TLS,
TLSSkipVerify: payload.TLSSkipVerify,
}
err := handler.snapshotAndPersistEndpoint(endpoint)
@@ -433,26 +402,19 @@ func (handler *Handler) createKubernetesEndpoint(payload *endpointCreatePayload)
}
func (handler *Handler) createTLSSecuredEndpoint(payload *endpointCreatePayload, endpointType portainer.EndpointType) (*portainer.Endpoint, *httperror.HandlerError) {
endpointID := handler.DataStore.Endpoint().GetNextIdentifier()
endpoint := &portainer.Endpoint{
ID: portainer.EndpointID(endpointID),
Name: payload.Name,
URL: payload.URL,
Type: endpointType,
GroupID: portainer.EndpointGroupID(payload.GroupID),
PublicURL: payload.PublicURL,
TLSConfig: portainer.TLSConfiguration{
TLS: payload.TLS,
TLSSkipVerify: payload.TLSSkipVerify,
},
UserAccessPolicies: portainer.UserAccessPolicies{},
TeamAccessPolicies: portainer.TeamAccessPolicies{},
TagIDs: payload.TagIDs,
Status: portainer.EndpointStatusUp,
Snapshots: []portainer.DockerSnapshot{},
Kubernetes: portainer.KubernetesDefault(),
IsEdgeDevice: payload.IsEdgeDevice,
endpoint := handler.DataStore.Endpoint().NewDefault()
endpoint.Name = payload.Name
endpoint.URL = payload.URL
endpoint.GroupID = portainer.EndpointGroupID(payload.GroupID)
endpoint.Type = endpointType
endpoint.PublicURL = payload.PublicURL
endpoint.TagIDs = payload.TagIDs
endpoint.TLSConfig = database.TLSConfiguration{
TLS: payload.TLS,
TLSSkipVerify: payload.TLSSkipVerify,
}
endpoint.IsEdgeDevice = payload.IsEdgeDevice
err := handler.storeTLSFiles(endpoint, payload)
if err != nil {
@@ -476,7 +438,7 @@ func (handler *Handler) snapshotAndPersistEndpoint(endpoint *portainer.Endpoint)
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to initiate communications with environment", err}
}
err = handler.saveEndpointAndUpdateAuthorizations(endpoint)
err = handler.saveEndpoint(endpoint)
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "An error occured while trying to create the environment", err}
}
@@ -484,20 +446,7 @@ func (handler *Handler) snapshotAndPersistEndpoint(endpoint *portainer.Endpoint)
return nil
}
func (handler *Handler) saveEndpointAndUpdateAuthorizations(endpoint *portainer.Endpoint) error {
endpoint.SecuritySettings = portainer.EndpointSecuritySettings{
AllowVolumeBrowserForRegularUsers: false,
EnableHostManagementFeatures: false,
AllowSysctlSettingForRegularUsers: true,
AllowBindMountsForRegularUsers: true,
AllowPrivilegedModeForRegularUsers: true,
AllowHostNamespaceForRegularUsers: true,
AllowContainerCapabilitiesForRegularUsers: true,
AllowDeviceMappingForRegularUsers: true,
AllowStackManagementForRegularUsers: true,
}
func (handler *Handler) saveEndpoint(endpoint *portainer.Endpoint) error {
err := handler.DataStore.Endpoint().Create(endpoint)
if err != nil {
return err

View File

@@ -1,13 +1,13 @@
package endpoints
import (
"github.com/portainer/portainer/api/database"
"net/http"
"strconv"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api"
)
// @id EndpointDelete
@@ -29,7 +29,7 @@ func (handler *Handler) endpointDelete(w http.ResponseWriter, r *http.Request) *
return &httperror.HandlerError{http.StatusBadRequest, "Invalid environment identifier route variable", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {
@@ -44,7 +44,7 @@ func (handler *Handler) endpointDelete(w http.ResponseWriter, r *http.Request) *
}
}
err = handler.DataStore.Endpoint().DeleteEndpoint(portainer.EndpointID(endpointID))
err = handler.DataStore.Endpoint().DeleteEndpoint(database.EndpointID(endpointID))
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to remove environment from the database", err}
}
@@ -122,7 +122,7 @@ func (handler *Handler) endpointDelete(w http.ResponseWriter, r *http.Request) *
return response.Empty(w)
}
func findEndpointIndex(tags []portainer.EndpointID, searchEndpointID portainer.EndpointID) int {
func findEndpointIndex(tags []database.EndpointID, searchEndpointID database.EndpointID) int {
for idx, tagID := range tags {
if searchEndpointID == tagID {
return idx
@@ -131,7 +131,7 @@ func findEndpointIndex(tags []portainer.EndpointID, searchEndpointID portainer.E
return -1
}
func removeElement(arr []portainer.EndpointID, index int) []portainer.EndpointID {
func removeElement(arr []database.EndpointID, index int) []database.EndpointID {
if index < 0 {
return arr
}

View File

@@ -4,6 +4,8 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/portainer/portainer/api/database"
registry2 "github.com/portainer/portainer/api/dataservices/registry"
"net/http"
"strconv"
"strings"
@@ -45,7 +47,7 @@ func (handler *Handler) endpointDockerhubStatus(w http.ResponseWriter, r *http.R
return &httperror.HandlerError{http.StatusBadRequest, "Invalid environment identifier route variable", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {
@@ -61,12 +63,12 @@ func (handler *Handler) endpointDockerhubStatus(w http.ResponseWriter, r *http.R
return &httperror.HandlerError{http.StatusBadRequest, "Invalid registry identifier route variable", err}
}
var registry *portainer.Registry
var registry *registry2.Registry
if registryID == 0 {
registry = &portainer.Registry{}
registry = &registry2.Registry{}
} else {
registry, err = handler.DataStore.Registry().Registry(portainer.RegistryID(registryID))
registry, err = handler.DataStore.Registry().Registry(registry2.RegistryID(registryID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find a registry with the specified identifier inside the database", err}
} else if err != nil {
@@ -92,7 +94,7 @@ func (handler *Handler) endpointDockerhubStatus(w http.ResponseWriter, r *http.R
return response.JSON(w, resp)
}
func getDockerHubToken(httpClient *client.HTTPClient, registry *portainer.Registry) (string, error) {
func getDockerHubToken(httpClient *client.HTTPClient, registry *registry2.Registry) (string, error) {
type dockerhubTokenResponse struct {
Token string `json:"token"`
}

View File

@@ -1,12 +1,12 @@
package endpoints
import (
"github.com/portainer/portainer/api/database"
"net/http"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api"
)
// @id EndpointInspect
@@ -29,7 +29,7 @@ func (handler *Handler) endpointInspect(w http.ResponseWriter, r *http.Request)
return &httperror.HandlerError{http.StatusBadRequest, "Invalid environment identifier route variable", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -1,6 +1,7 @@
package endpoints
import (
"github.com/portainer/portainer/api/database"
"net/http"
"strconv"
"strings"
@@ -56,7 +57,7 @@ func (handler *Handler) endpointList(w http.ResponseWriter, r *http.Request) *ht
tagsPartialMatch, _ := request.RetrieveBooleanQueryParameter(r, "tagsPartialMatch", true)
var endpointIDs []portainer.EndpointID
var endpointIDs []database.EndpointID
request.RetrieveJSONQueryParameter(r, "endpointIds", &endpointIDs, true)
endpointGroups, err := handler.DataStore.EndpointGroup().EndpointGroups()
@@ -321,10 +322,10 @@ func endpointFullMatchTags(endpoint portainer.Endpoint, endpointGroup portainer.
return len(missingTags) == 0
}
func filteredEndpointsByIds(endpoints []portainer.Endpoint, ids []portainer.EndpointID) []portainer.Endpoint {
func filteredEndpointsByIds(endpoints []portainer.Endpoint, ids []database.EndpointID) []portainer.Endpoint {
filteredEndpoints := make([]portainer.Endpoint, 0)
idsSet := make(map[portainer.EndpointID]bool)
idsSet := make(map[database.EndpointID]bool)
for _, id := range ids {
idsSet[id] = true
}

View File

@@ -1,12 +1,13 @@
package endpoints
import (
"github.com/portainer/portainer/api/database"
registry2 "github.com/portainer/portainer/api/dataservices/registry"
"net/http"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api"
httperrors "github.com/portainer/portainer/api/http/errors"
"github.com/portainer/portainer/api/http/security"
)
@@ -37,7 +38,7 @@ func (handler *Handler) endpointRegistryInspect(w http.ResponseWriter, r *http.R
return &httperror.HandlerError{StatusCode: http.StatusBadRequest, Message: "Invalid registry identifier route variable", Err: err}
}
registry, err := handler.DataStore.Registry().Registry(portainer.RegistryID(registryID))
registry, err := handler.DataStore.Registry().Registry(registry2.RegistryID(registryID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{StatusCode: http.StatusNotFound, Message: "Unable to find a registry with the specified identifier inside the database", Err: err}
} else if err != nil {
@@ -54,7 +55,7 @@ func (handler *Handler) endpointRegistryInspect(w http.ResponseWriter, r *http.R
return &httperror.HandlerError{StatusCode: http.StatusInternalServerError, Message: "Unable to retrieve user from the database", Err: err}
}
if !security.AuthorizedRegistryAccess(registry, user, securityContext.UserMemberships, portainer.EndpointID(endpointID)) {
if !security.AuthorizedRegistryAccess(registry, user, securityContext.UserMemberships, database.EndpointID(endpointID)) {
return &httperror.HandlerError{StatusCode: http.StatusForbidden, Message: "Access denied to resource", Err: httperrors.ErrResourceAccessDenied}
}

View File

@@ -1,6 +1,8 @@
package endpoints
import (
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/registry"
"net/http"
"github.com/pkg/errors"
@@ -41,7 +43,7 @@ func (handler *Handler) endpointRegistriesList(w http.ResponseWriter, r *http.Re
return &httperror.HandlerError{StatusCode: http.StatusBadRequest, Message: "Invalid environment identifier route variable", Err: err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {
@@ -87,7 +89,7 @@ func (handler *Handler) endpointRegistriesList(w http.ResponseWriter, r *http.Re
return response.JSON(w, registries)
}
func (handler *Handler) isNamespaceAuthorized(endpoint *portainer.Endpoint, namespace string, userId portainer.UserID, memberships []portainer.TeamMembership, isAdmin bool) (bool, error) {
func (handler *Handler) isNamespaceAuthorized(endpoint *portainer.Endpoint, namespace string, userId database.UserID, memberships []portainer.TeamMembership, isAdmin bool) (bool, error) {
if isAdmin || namespace == "" {
return true, nil
}
@@ -114,12 +116,12 @@ func (handler *Handler) isNamespaceAuthorized(endpoint *portainer.Endpoint, name
return security.AuthorizedAccess(userId, memberships, namespacePolicy.UserAccessPolicies, namespacePolicy.TeamAccessPolicies), nil
}
func filterRegistriesByNamespace(registries []portainer.Registry, endpointId portainer.EndpointID, namespace string) []portainer.Registry {
func filterRegistriesByNamespace(registries []registry.Registry, endpointId database.EndpointID, namespace string) []registry.Registry {
if namespace == "" {
return registries
}
filteredRegistries := []portainer.Registry{}
filteredRegistries := []registry.Registry{}
for _, registry := range registries {
for _, authorizedNamespace := range registry.RegistryAccesses[endpointId].Namespaces {
@@ -132,7 +134,7 @@ func filterRegistriesByNamespace(registries []portainer.Registry, endpointId por
return filteredRegistries
}
func hideRegistryFields(registry *portainer.Registry, hideAccesses bool) {
func hideRegistryFields(registry *registry.Registry, hideAccesses bool) {
registry.Password = ""
registry.ManagementConfiguration = nil
if hideAccesses {

View File

@@ -1,6 +1,8 @@
package endpoints
import (
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/registry"
"net/http"
httperror "github.com/portainer/libhttp/error"
@@ -11,8 +13,8 @@ import (
)
type registryAccessPayload struct {
UserAccessPolicies portainer.UserAccessPolicies
TeamAccessPolicies portainer.TeamAccessPolicies
UserAccessPolicies database.UserAccessPolicies
TeamAccessPolicies database.TeamAccessPolicies
Namespaces []string
}
@@ -48,7 +50,7 @@ func (handler *Handler) endpointRegistryAccess(w http.ResponseWriter, r *http.Re
return &httperror.HandlerError{StatusCode: http.StatusBadRequest, Message: "Invalid registry identifier route variable", Err: err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{StatusCode: http.StatusNotFound, Message: "Unable to find an environment with the specified identifier inside the database", Err: err}
} else if err != nil {
@@ -69,7 +71,7 @@ func (handler *Handler) endpointRegistryAccess(w http.ResponseWriter, r *http.Re
return &httperror.HandlerError{StatusCode: http.StatusForbidden, Message: "User is not authorized", Err: err}
}
registry, err := handler.DataStore.Registry().Registry(portainer.RegistryID(registryID))
thisRegistry, err := handler.DataStore.Registry().Registry(registry.RegistryID(registryID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{StatusCode: http.StatusNotFound, Message: "Unable to find an environment with the specified identifier inside the database", Err: err}
} else if err != nil {
@@ -82,18 +84,18 @@ func (handler *Handler) endpointRegistryAccess(w http.ResponseWriter, r *http.Re
return &httperror.HandlerError{StatusCode: http.StatusBadRequest, Message: "Invalid request payload", Err: err}
}
if registry.RegistryAccesses == nil {
registry.RegistryAccesses = portainer.RegistryAccesses{}
if thisRegistry.RegistryAccesses == nil {
thisRegistry.RegistryAccesses = registry.RegistryAccesses{}
}
if _, ok := registry.RegistryAccesses[endpoint.ID]; !ok {
registry.RegistryAccesses[endpoint.ID] = portainer.RegistryAccessPolicies{}
if _, ok := thisRegistry.RegistryAccesses[endpoint.ID]; !ok {
thisRegistry.RegistryAccesses[endpoint.ID] = registry.RegistryAccessPolicies{}
}
registryAccess := registry.RegistryAccesses[endpoint.ID]
registryAccess := thisRegistry.RegistryAccesses[endpoint.ID]
if endpoint.Type == portainer.KubernetesLocalEnvironment || endpoint.Type == portainer.AgentOnKubernetesEnvironment || endpoint.Type == portainer.EdgeAgentOnKubernetesEnvironment {
err := handler.updateKubeAccess(endpoint, registry, registryAccess.Namespaces, payload.Namespaces)
err := handler.updateKubeAccess(endpoint, thisRegistry, registryAccess.Namespaces, payload.Namespaces)
if err != nil {
return &httperror.HandlerError{StatusCode: http.StatusInternalServerError, Message: "Unable to update kube access policies", Err: err}
}
@@ -104,14 +106,14 @@ func (handler *Handler) endpointRegistryAccess(w http.ResponseWriter, r *http.Re
registryAccess.TeamAccessPolicies = payload.TeamAccessPolicies
}
registry.RegistryAccesses[portainer.EndpointID(endpointID)] = registryAccess
thisRegistry.RegistryAccesses[database.EndpointID(endpointID)] = registryAccess
handler.DataStore.Registry().UpdateRegistry(registry.ID, registry)
handler.DataStore.Registry().UpdateRegistry(thisRegistry.ID, thisRegistry)
return response.Empty(w)
}
func (handler *Handler) updateKubeAccess(endpoint *portainer.Endpoint, registry *portainer.Registry, oldNamespaces, newNamespaces []string) error {
func (handler *Handler) updateKubeAccess(endpoint *portainer.Endpoint, registry *registry.Registry, oldNamespaces, newNamespaces []string) error {
oldNamespacesSet := toSet(oldNamespaces)
newNamespacesSet := toSet(newNamespaces)

View File

@@ -1,12 +1,12 @@
package endpoints
import (
"github.com/portainer/portainer/api/database"
"net/http"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api"
)
type endpointSettingsUpdatePayload struct {
@@ -62,7 +62,7 @@ func (handler *Handler) endpointSettingsUpdate(w http.ResponseWriter, r *http.Re
return &httperror.HandlerError{http.StatusBadRequest, "Invalid request payload", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {
@@ -109,7 +109,7 @@ func (handler *Handler) endpointSettingsUpdate(w http.ResponseWriter, r *http.Re
endpoint.SecuritySettings = securitySettings
err = handler.DataStore.Endpoint().UpdateEndpoint(portainer.EndpointID(endpointID), endpoint)
err = handler.DataStore.Endpoint().UpdateEndpoint(database.EndpointID(endpointID), endpoint)
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Failed persisting environment in database", err}
}

View File

@@ -2,13 +2,14 @@ package endpoints
import (
"errors"
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/orchestrators/snapshot"
"net/http"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/internal/snapshot"
)
// @id EndpointSnapshot
@@ -30,7 +31,7 @@ func (handler *Handler) endpointSnapshot(w http.ResponseWriter, r *http.Request)
return &httperror.HandlerError{http.StatusBadRequest, "Invalid environment identifier route variable", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -1,13 +1,13 @@
package endpoints
import (
"github.com/portainer/portainer/api/orchestrators/snapshot"
"log"
"net/http"
httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/internal/snapshot"
)
// @id EndpointSnapshots

View File

@@ -3,6 +3,8 @@ package endpoints
import (
"encoding/base64"
"errors"
"github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/dataservices/edgejob"
"net/http"
"strconv"
"time"
@@ -22,7 +24,7 @@ type stackStatusResponse struct {
type edgeJobResponse struct {
// EdgeJob Identifier
ID portainer.EdgeJobID `json:"Id" example:"2"`
ID edgejob.EdgeJobID `json:"Id" example:"2"`
// Whether to collect logs
CollectLogs bool `json:"CollectLogs" example:"true"`
// A cron expression to schedule this job
@@ -68,7 +70,7 @@ func (handler *Handler) endpointStatusInspect(w http.ResponseWriter, r *http.Req
return &httperror.HandlerError{http.StatusBadRequest, "Invalid environment identifier route variable", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {

View File

@@ -1,6 +1,7 @@
package endpoints
import (
"github.com/portainer/portainer/api/database"
"net/http"
"reflect"
"strconv"
@@ -40,8 +41,8 @@ type endpointUpdatePayload struct {
AzureAuthenticationKey *string `example:"cOrXoK/1D35w8YQ8nH1/8ZGwzz45JIYD5jxHKXEQknk="`
// List of tag identifiers to which this environment(endpoint) is associated
TagIDs []portainer.TagID `example:"1,2"`
UserAccessPolicies portainer.UserAccessPolicies
TeamAccessPolicies portainer.TeamAccessPolicies
UserAccessPolicies database.UserAccessPolicies
TeamAccessPolicies database.TeamAccessPolicies
// The check in interval for edge agent (in seconds)
EdgeCheckinInterval *int `example:"5"`
// Associated Kubernetes data
@@ -82,7 +83,7 @@ func (handler *Handler) endpointUpdate(w http.ResponseWriter, r *http.Request) *
return &httperror.HandlerError{http.StatusBadRequest, "Invalid request payload", err}
}
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
endpoint, err := handler.DataStore.Endpoint().Endpoint(database.EndpointID(endpointID))
if handler.DataStore.IsErrObjectNotFound(err) {
return &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment with the specified identifier inside the database", err}
} else if err != nil {

Some files were not shown because too many files have changed in this diff Show More