github.com/mendersoftware/go-lib-micro@v0.0.0-20240304135804-e8e39c59b148/mongo/migrate/migrator_dummy.go (about)

     1  // Copyright 2023 Northern.tech AS
     2  //
     3  //	Licensed under the Apache License, Version 2.0 (the "License");
     4  //	you may not use this file except in compliance with the License.
     5  //	You may obtain a copy of the License at
     6  //
     7  //	    http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  //	Unless required by applicable law or agreed to in writing, software
    10  //	distributed under the License is distributed on an "AS IS" BASIS,
    11  //	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  //	See the License for the specific language governing permissions and
    13  //	limitations under the License.
    14  package migrate
    15  
    16  import (
    17  	"context"
    18  	"errors"
    19  	"fmt"
    20  
    21  	"go.mongodb.org/mongo-driver/mongo"
    22  
    23  	"github.com/mendersoftware/go-lib-micro/log"
    24  )
    25  
    26  // MigratorDummy does not actually apply migrations, just inserts the
    27  // target version into the db to mark the initial/current state.
    28  type DummyMigrator struct {
    29  	Client      *mongo.Client
    30  	Db          string
    31  	Automigrate bool
    32  }
    33  
    34  // Apply makes MigratorDummy implement the Migrator interface.
    35  func (m *DummyMigrator) Apply(ctx context.Context, target Version, migrations []Migration) error {
    36  	l := log.FromContext(ctx).F(log.Ctx{"db": m.Db})
    37  
    38  	applied, err := GetMigrationInfo(ctx, m.Client, m.Db)
    39  	if err != nil {
    40  		return err
    41  	}
    42  
    43  	if len(applied) > 1 {
    44  		return errors.New("dummy migrator cannot apply migrations, more than 1 already applied")
    45  	}
    46  
    47  	last := Version{}
    48  	if len(applied) == 1 {
    49  		last = applied[0].Version
    50  	}
    51  
    52  	if !m.Automigrate {
    53  		if VersionIsLess(last, target) {
    54  			return fmt.Errorf(ErrNeedsMigration+": %s has version %s, needs version %s", m.Db, last.String(), target.String())
    55  		} else {
    56  			return nil
    57  		}
    58  	}
    59  
    60  	if VersionIsLess(last, target) {
    61  		l.Infof("applying migration from version %s to %s", last, target)
    62  		return UpdateMigrationInfo(ctx, target, m.Client, m.Db)
    63  	} else {
    64  		l.Infof("migration to version %s skipped", target)
    65  	}
    66  
    67  	return nil
    68  }