1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-08-05 13:55:21 +02:00

refactor(api): use a standard stack identifier (#1980)

This commit is contained in:
Anthony Lapenna 2018-06-18 12:07:56 +02:00 committed by GitHub
parent da5a430b8c
commit b4c2820ad7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 150 additions and 38 deletions

View file

@ -31,6 +31,7 @@ type Store struct {
db *bolt.DB
checkForDataMigration bool
FileService portainer.FileService
}
const (
@ -50,7 +51,7 @@ const (
)
// NewStore initializes a new Store and the associated services
func NewStore(storePath string) (*Store, error) {
func NewStore(storePath string, fileService portainer.FileService) (*Store, error) {
store := &Store{
Path: storePath,
UserService: &UserService{},
@ -65,6 +66,7 @@ func NewStore(storePath string) (*Store, error) {
DockerHubService: &DockerHubService{},
StackService: &StackService{},
TagService: &TagService{},
FileService: fileService,
}
store.UserService.store = store
store.TeamService.store = store

View file

@ -1,6 +1,13 @@
package bolt
import "github.com/portainer/portainer"
import (
"strconv"
"strings"
"github.com/boltdb/bolt"
"github.com/portainer/portainer"
"github.com/portainer/portainer/bolt/internal"
)
func (m *Migrator) updateEndpointsToVersion12() error {
legacyEndpoints, err := m.EndpointService.Endpoints()
@ -38,16 +45,24 @@ func (m *Migrator) updateEndpointGroupsToVersion12() error {
return nil
}
type legacyStack struct {
ID string `json:"Id"`
Name string `json:"Name"`
EndpointID portainer.EndpointID `json:"EndpointId"`
SwarmID string `json:"SwarmId"`
EntryPoint string `json:"EntryPoint"`
Env []portainer.Pair `json:"Env"`
ProjectPath string
}
func (m *Migrator) updateStacksToVersion12() error {
legacyStacks, err := m.StackService.Stacks()
legacyStacks, err := m.retrieveLegacyStacks()
if err != nil {
return err
}
for _, stack := range legacyStacks {
stack.Type = portainer.DockerSwarmStack
err = m.StackService.UpdateStack(stack.ID, &stack)
for _, legacyStack := range legacyStacks {
err := m.convertLegacyStack(&legacyStack)
if err != nil {
return err
}
@ -55,3 +70,64 @@ func (m *Migrator) updateStacksToVersion12() error {
return nil
}
func (m *Migrator) convertLegacyStack(s *legacyStack) error {
stackID := m.StackService.GetNextIdentifier()
stack := &portainer.Stack{
ID: portainer.StackID(stackID),
Name: s.Name,
Type: portainer.DockerSwarmStack,
SwarmID: s.SwarmID,
EndpointID: 0,
EntryPoint: s.EntryPoint,
Env: s.Env,
}
stack.ProjectPath = strings.Replace(s.ProjectPath, s.ID, strconv.Itoa(stackID), 1)
err := m.store.FileService.Rename(s.ProjectPath, stack.ProjectPath)
if err != nil {
return err
}
err = m.deleteLegacyStack(s.ID)
if err != nil {
return err
}
return m.StackService.CreateStack(stack)
}
func (m *Migrator) deleteLegacyStack(legacyID string) error {
return m.store.db.Update(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(stackBucketName))
err := bucket.Delete([]byte(legacyID))
if err != nil {
return err
}
return nil
})
}
func (m *Migrator) retrieveLegacyStacks() ([]legacyStack, error) {
var legacyStacks = make([]legacyStack, 0)
err := m.store.db.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(stackBucketName))
cursor := bucket.Cursor()
for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
var stack legacyStack
err := internal.UnmarshalObject(v, &stack)
if err != nil {
return err
}
legacyStacks = append(legacyStacks, stack)
}
return nil
})
if err != nil {
return nil, err
}
return legacyStacks, nil
}

View file

@ -14,6 +14,7 @@ type Migrator struct {
StackService *StackService
UserService *UserService
VersionService *VersionService
FileService portainer.FileService
}
// NewMigrator creates a new Migrator.

View file

@ -17,7 +17,7 @@ func (service *StackService) Stack(ID portainer.StackID) (*portainer.Stack, erro
var data []byte
err := service.store.db.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(stackBucketName))
value := bucket.Get([]byte(ID))
value := bucket.Get(internal.Itob(int(ID)))
if value == nil {
return portainer.ErrStackNotFound
}
@ -92,17 +92,36 @@ func (service *StackService) Stacks() ([]portainer.Stack, error) {
return stacks, nil
}
// GetNextIdentifier returns the current bucket identifier incremented by 1.
func (service *StackService) GetNextIdentifier() int {
var identifier int
service.store.db.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(stackBucketName))
id := bucket.Sequence()
identifier = int(id)
return nil
})
identifier++
return identifier
}
// CreateStack creates a new stack.
func (service *StackService) CreateStack(stack *portainer.Stack) error {
return service.store.db.Update(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(stackBucketName))
err := bucket.SetSequence(uint64(stack.ID))
if err != nil {
return err
}
data, err := internal.MarshalObject(stack)
if err != nil {
return err
}
err = bucket.Put([]byte(stack.ID), data)
err = bucket.Put(internal.Itob(int(stack.ID)), data)
if err != nil {
return err
}
@ -119,7 +138,7 @@ func (service *StackService) UpdateStack(ID portainer.StackID, stack *portainer.
return service.store.db.Update(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(stackBucketName))
err = bucket.Put([]byte(ID), data)
err = bucket.Put(internal.Itob(int(ID)), data)
if err != nil {
return err
}
@ -131,7 +150,7 @@ func (service *StackService) UpdateStack(ID portainer.StackID, stack *portainer.
func (service *StackService) DeleteStack(ID portainer.StackID) error {
return service.store.db.Update(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(stackBucketName))
err := bucket.Delete([]byte(ID))
err := bucket.Delete(internal.Itob(int(ID)))
if err != nil {
return err
}