github.com/avenga/couper@v1.12.2/config/configload/deprecated.go (about)

     1  package configload
     2  
     3  import (
     4  	"github.com/hashicorp/hcl/v2/hclsyntax"
     5  	"github.com/sirupsen/logrus"
     6  )
     7  
     8  type deprecated struct {
     9  	newName string
    10  	version string
    11  }
    12  
    13  type (
    14  	attributesList map[string]deprecated
    15  	blocksList     map[string]deprecated
    16  	labelsList     map[string]deprecated
    17  )
    18  
    19  var (
    20  	deprecatedAttributes attributesList
    21  	deprecatedBlocks     blocksList
    22  	deprecatedLabels     labelsList
    23  )
    24  
    25  func init() {
    26  	deprecatedAttributes = make(map[string]deprecated)
    27  	deprecatedBlocks = make(map[string]deprecated)
    28  	deprecatedLabels = make(map[string]deprecated)
    29  
    30  	// Deprecated attributes:
    31  	// deprecatedAttributes["..."] = deprecated{"...", "..."}
    32  	deprecatedAttributes["beta_permissions_claim"] = deprecated{"permissions_claim", "1.13"}
    33  	deprecatedAttributes["beta_permissions_map"] = deprecated{"permissions_map", "1.13"}
    34  	deprecatedAttributes["beta_permissions_map_file"] = deprecated{"permissions_map_file", "1.13"}
    35  	deprecatedAttributes["beta_required_permission"] = deprecated{"required_permission", "1.13"}
    36  	deprecatedAttributes["beta_roles_claim"] = deprecated{"roles_claim", "1.13"}
    37  	deprecatedAttributes["beta_roles_map"] = deprecated{"roles_map", "1.13"}
    38  	deprecatedAttributes["beta_roles_file"] = deprecated{"roles_map_file", "1.13"}
    39  
    40  	// Deprecated blocks:
    41  	// deprecatedBlocks["..."] = deprecated{"...", "..."}
    42  
    43  	// Deprecated labels:
    44  	// deprecatedLabels["..."] = deprecated{"...", "..."}
    45  	deprecatedLabels["beta_insufficient_permissions"] = deprecated{"insufficient_permissions", "1.13"}
    46  
    47  	// TODO with 1.13, also remove
    48  	// ctxAcMap["beta_"+grantedPermissions] = seetie.GoToValue(gp)
    49  	// ctxAcMap["beta_"+requiredPermission] = seetie.GoToValue(rp)
    50  	// in eval/context.go newVariable()
    51  }
    52  
    53  func deprecate(bodies []*hclsyntax.Body, logger *logrus.Entry) {
    54  	for _, body := range bodies {
    55  		deprecateBody(body, logger)
    56  	}
    57  }
    58  
    59  func deprecateBody(body *hclsyntax.Body, logger *logrus.Entry) {
    60  	if body == nil {
    61  		return
    62  	}
    63  
    64  	body.Attributes = deprecateAttributes(body.Attributes, logger)
    65  
    66  	deprecateBlocks(body.Blocks, logger)
    67  }
    68  
    69  func deprecateAttributes(attributes hclsyntax.Attributes, logger *logrus.Entry) hclsyntax.Attributes {
    70  	attrs := make(hclsyntax.Attributes)
    71  
    72  	for _, attr := range attributes {
    73  		name := attr.Name
    74  
    75  		if rename, exists := deprecatedAttributes[name]; exists {
    76  			rename.log("attribute", name, logger)
    77  
    78  			name = rename.newName
    79  		}
    80  
    81  		attrs[name] = attr
    82  	}
    83  
    84  	return attrs
    85  }
    86  
    87  func deprecateBlocks(blocks hclsyntax.Blocks, logger *logrus.Entry) {
    88  	for _, block := range blocks {
    89  		block.Labels = deprecateLabels(block, logger)
    90  
    91  		if rename, exists := deprecatedBlocks[block.Type]; exists {
    92  			rename.log("block", block.Type, logger)
    93  
    94  			block.Type = rename.newName
    95  		}
    96  
    97  		deprecateBody(block.Body, logger)
    98  	}
    99  }
   100  
   101  func deprecateLabels(block *hclsyntax.Block, logger *logrus.Entry) []string {
   102  	var (
   103  		err     error
   104  		labels  []string = block.Labels
   105  		renamed []string
   106  	)
   107  
   108  	if block.Type == errorHandler {
   109  		labels, err = newKindsFromLabels(block, false)
   110  
   111  		if err != nil {
   112  			return block.Labels
   113  		}
   114  	}
   115  
   116  	for _, label := range labels {
   117  		name := label
   118  
   119  		if rename, exists := deprecatedLabels[label]; exists {
   120  			rename.log("label", label, logger)
   121  
   122  			name = rename.newName
   123  		}
   124  
   125  		renamed = append(renamed, name)
   126  	}
   127  
   128  	return renamed
   129  }
   130  
   131  // In some test cases the logger is <nil>, but not in production code.
   132  func (d deprecated) log(name, old string, logger *logrus.Entry) {
   133  	if logger != nil {
   134  		logger.Warnf(
   135  			"replacing %s %q with %q; as of Couper version %s, the old value is no longer supported",
   136  			name, old, d.newName, d.version,
   137  		)
   138  	}
   139  }