github.com/mre-fog/trillianxx@v1.1.2-0.20180615153820-ae375a99d36a/storage/admin_helpers.go (about)

     1  // Copyright 2017 Google Inc. All Rights Reserved.
     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  
    15  package storage
    16  
    17  import (
    18  	"context"
    19  	"fmt"
    20  
    21  	"github.com/google/trillian"
    22  	"go.opencensus.io/trace"
    23  )
    24  
    25  const traceSpanRoot = "github.com/google/trillian/storage"
    26  
    27  // GetTree reads a tree from storage using a snapshot transaction.
    28  // It's a convenience wrapper around RunInAdminSnapshot and AdminReader's GetTree.
    29  // See RunInAdminSnapshot if you need to perform more than one action per transaction.
    30  func GetTree(ctx context.Context, admin AdminStorage, treeID int64) (*trillian.Tree, error) {
    31  	ctx, span := spanFor(ctx, "GetTree")
    32  	defer span.End()
    33  	var tree *trillian.Tree
    34  	err := RunInAdminSnapshot(ctx, admin, func(tx ReadOnlyAdminTX) (err error) {
    35  		tree, err = tx.GetTree(ctx, treeID)
    36  		return
    37  	})
    38  	return tree, err
    39  }
    40  
    41  // ListTrees reads trees from storage using a snapshot transaction.
    42  // It's a convenience wrapper around RunInAdminSnapshot and AdminReader's ListTrees.
    43  // See RunInAdminSnapshot if you need to perform more than one action per transaction.
    44  func ListTrees(ctx context.Context, admin AdminStorage, includeDeleted bool) ([]*trillian.Tree, error) {
    45  	ctx, span := spanFor(ctx, "ListTrees")
    46  	defer span.End()
    47  	var resp []*trillian.Tree
    48  	err := RunInAdminSnapshot(ctx, admin, func(tx ReadOnlyAdminTX) (err error) {
    49  		resp, err = tx.ListTrees(ctx, includeDeleted)
    50  		return
    51  	})
    52  	return resp, err
    53  }
    54  
    55  // CreateTree creates a tree in storage.
    56  // It's a convenience wrapper around ReadWriteTransaction and AdminWriter's CreateTree.
    57  // See ReadWriteTransaction if you need to perform more than one action per transaction.
    58  func CreateTree(ctx context.Context, admin AdminStorage, tree *trillian.Tree) (*trillian.Tree, error) {
    59  	ctx, span := spanFor(ctx, "CreateTree")
    60  	defer span.End()
    61  	var createdTree *trillian.Tree
    62  	err := admin.ReadWriteTransaction(ctx, func(ctx context.Context, tx AdminTX) (err error) {
    63  		createdTree, err = tx.CreateTree(ctx, tree)
    64  		return
    65  	})
    66  	return createdTree, err
    67  }
    68  
    69  // UpdateTree updates a tree in storage.
    70  // It's a convenience wrapper around ReadWriteTransaction and AdminWriter's UpdateTree.
    71  // See ReadWriteTransaction if you need to perform more than one action per transaction.
    72  func UpdateTree(ctx context.Context, admin AdminStorage, treeID int64, fn func(*trillian.Tree)) (*trillian.Tree, error) {
    73  	ctx, span := spanFor(ctx, "UpdateTree")
    74  	defer span.End()
    75  	var updatedTree *trillian.Tree
    76  	err := admin.ReadWriteTransaction(ctx, func(ctx context.Context, tx AdminTX) (err error) {
    77  		updatedTree, err = tx.UpdateTree(ctx, treeID, fn)
    78  		return
    79  	})
    80  	return updatedTree, err
    81  }
    82  
    83  // SoftDeleteTree soft-deletes a tree in storage.
    84  // It's a convenience wrapper around ReadWriteTransaction and AdminWriter's SoftDeleteTree.
    85  // See ReadWriteTransaction if you need to perform more than one action per transaction.
    86  func SoftDeleteTree(ctx context.Context, admin AdminStorage, treeID int64) (*trillian.Tree, error) {
    87  	ctx, span := spanFor(ctx, "SoftDeleteTree")
    88  	defer span.End()
    89  	var tree *trillian.Tree
    90  	err := admin.ReadWriteTransaction(ctx, func(ctx context.Context, tx AdminTX) (err error) {
    91  		tree, err = tx.SoftDeleteTree(ctx, treeID)
    92  		return
    93  	})
    94  	return tree, err
    95  }
    96  
    97  // HardDeleteTree hard-deletes a tree from storage.
    98  // It's a convenience wrapper around ReadWriteTransaction and AdminWriter's HardDeleteTree.
    99  // See ReadWriteTransaction if you need to perform more than one action per transaction.
   100  func HardDeleteTree(ctx context.Context, admin AdminStorage, treeID int64) error {
   101  	ctx, span := spanFor(ctx, "HardDeleteTree")
   102  	defer span.End()
   103  	return admin.ReadWriteTransaction(ctx, func(ctx context.Context, tx AdminTX) error {
   104  		return tx.HardDeleteTree(ctx, treeID)
   105  	})
   106  }
   107  
   108  // UndeleteTree undeletes a tree in storage.
   109  // It's a convenience wrapper around ReadWriteTransaction and AdminWriter's UndeleteTree.
   110  // See ReadWriteTransaction if you need to perform more than one action per transaction.
   111  func UndeleteTree(ctx context.Context, admin AdminStorage, treeID int64) (*trillian.Tree, error) {
   112  	ctx, span := spanFor(ctx, "UndeleteTree")
   113  	defer span.End()
   114  	var tree *trillian.Tree
   115  	err := admin.ReadWriteTransaction(ctx, func(ctx context.Context, tx AdminTX) (err error) {
   116  		tree, err = tx.UndeleteTree(ctx, treeID)
   117  		return
   118  	})
   119  	return tree, err
   120  }
   121  
   122  func spanFor(ctx context.Context, name string) (context.Context, *trace.Span) {
   123  	return trace.StartSpan(ctx, fmt.Sprintf("%s.%s", traceSpanRoot, name))
   124  }