/// <summary> /// Initializes a new instance of the <see cref="UnsupportedResourceWarning"/> class. /// </summary> /// <param name="intrinsic">The intrinsic being warned about.</param> /// <param name="containingResource">The resource that contains the errant intrinsic.</param> /// <param name="location">The the AWS property path to the intrinsic being warned about.</param> public UnsupportedResourceWarning( IIntrinsic intrinsic, IResource containingResource, PropertyPath location) : base(intrinsic, containingResource, location) { }
/// <summary> /// Initializes a new instance of the <see cref="UnreferenceableIntrinsicWarning"/> class. /// </summary> /// <param name="intrinsic">The intrinsic being warned about.</param> /// <param name="containingResource">The resource that contains the errant intrinsic.</param> /// <param name="location">The the AWS property path to the intrinsic being warned about.</param> public UnreferenceableIntrinsicWarning( IIntrinsic intrinsic, IResource containingResource, PropertyPath location) : base(intrinsic, containingResource, location) { }
/// <summary> /// Initializes a new instance of the <see cref="IfIntrinsicInfo"/> class. /// </summary> /// <param name="propertyPath">The property path.</param> /// <param name="intrinsic">The intrinsic.</param> /// <param name="resourceMapping">Summary info of the resource targeted by this intrinsic.</param> /// <param name="evaluation">The evaluation.</param> public IfIntrinsicInfo( PropertyPath propertyPath, IIntrinsic intrinsic, ResourceMapping resourceMapping, object evaluation) : base(propertyPath, intrinsic, resourceMapping, evaluation) { }
/// <summary> /// Initializes a new instance of the <see cref="DependencyResolutionWarning"/> class. /// </summary> /// <param name="intrinsic">The intrinsic being warned about.</param> /// <param name="containingResource">The resource that contains the errant intrinsic.</param> /// <param name="location">The the AWS property path to the intrinsic being warned about.</param> protected DependencyResolutionWarning( IIntrinsic intrinsic, IResource containingResource, PropertyPath location) : base(string.Empty) { this.Location = location.Clone(); this.Intrinsic = intrinsic; this.ContainingResource = containingResource; }
/// <summary> /// Initializes a new instance of the <see cref="IntrinsicInfo"/> class. /// </summary> /// <param name="propertyPath">The property path.</param> /// <param name="intrinsic">The intrinsic.</param> /// <param name="resourceMapping">Summary info of the resource targeted by this intrinsic.</param> /// <param name="evaluation">The evaluation.</param> public IntrinsicInfo( PropertyPath propertyPath, IIntrinsic intrinsic, ResourceMapping resourceMapping, object evaluation) { this.targetResource = resourceMapping; this.intrinsic = intrinsic; this.PropertyPath = propertyPath.Clone(); this.InitialEvaluation = evaluation; this.intrinsic.ExtraData = this; }
/// <summary> /// Renders this intrinsic to a <see cref="Reference"/> that can be embedded into the in-memory state file. /// </summary> /// <param name="self">The intrinsic being rendered.</param> /// <param name="template">Reference to CloudFormation template.</param> /// <param name="resource">Resource referenced by the intrinsic.</param> /// <param name="inputs">The list of input variables and data sources.</param> /// <returns>A <see cref="Reference"/> or <c>null</c> if a reference cannot be created.</returns> /// <exception cref="System.ArgumentNullException">self cannot be null</exception> public static Reference Render( this IIntrinsic self, ITemplate template, ResourceMapping resource, IList <InputVariable> inputs) { if (self == null) { throw new ArgumentNullException(nameof(self)); } return(self.Render(template, resource, inputs, -1)); }
/// <summary> /// Evaluates the specified intrinsic. /// </summary> /// <param name="self">The intrinsic.</param> /// <param name="intrinsicInfo">The <see cref="IntrinsicInfo"/> related to this intrinsic.</param> /// <returns>The evaluated result.</returns> public static object Evaluate(this IIntrinsic self, IntrinsicInfo intrinsicInfo) { // ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault switch (self.Type) { case IntrinsicType.Join: return(EvaluateJoin((JoinIntrinsic)self)); default: return(intrinsicInfo.InitialEvaluation); } }
/// <summary> /// Begin processing an intrinsic. /// </summary> /// <param name="intrinsic">The intrinsic.</param> /// <param name="currentPath">The current path.</param> public void EnterIntrinsic(IIntrinsic intrinsic, PropertyPath currentPath) { if (this.lastWarning != null) { // Something that can't be resolved has been found, // so don't process any more here. return; } var clonedPath = currentPath.Clone(); try { if (this.parentIntrinsicPath == null) { // This is a "top level" intrinsic associated directly with a resource attribute. if (this.currentCloudFormationResource.Type == "AWS::Lambda::Permission" && currentPath.Path == "FunctionName" && intrinsic is RefIntrinsic) { // !! NASTY KLUDGE ALERT !! // AWS treats this property as a !Ref which is lambda function's name, but terraform actually wants the ARN here. // If I find more cases like this, then I'll put something into resource traits intrinsic = new GetAttIntrinsic( intrinsic.GetReferencedObjects(this.template).First(), "Arn"); } this.intrinsicInfos.Push(this.currentIntrinsicInfo); this.parentIntrinsicPath = clonedPath; this.currentIntrinsicInfo = this.GetIntrinsicInfo(intrinsic, currentPath); } else { // We have descended the graph to member intrinsic this.intrinsicInfos.Push(this.currentIntrinsicInfo); var intrinsicInfo = this.GetIntrinsicInfo(intrinsic, currentPath); this.currentIntrinsicInfo.NestedIntrinsics.Add(intrinsicInfo); this.currentIntrinsicInfo = intrinsicInfo; } } catch (DependencyResolutionWarning w) { this.lastWarning = w; } }
/// <summary> /// Gets the related information required to create <see cref="Reference"/> objects from the specified intrinsic. /// </summary> /// <param name="intrinsic">The intrinsic.</param> /// <param name="currentPath">Location within CloudFormation resource of this intrinsic</param> /// <returns>An <see cref="IntrinsicInfo"/> object.</returns> /// <exception cref="Amazon.CloudFormation.Model.InvalidOperationException">Can't currently describe {intrinsic.TagName}</exception> private IntrinsicInfo GetIntrinsicInfo(IIntrinsic intrinsic, PropertyPath currentPath) { // ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault switch (intrinsic.Type) { case IntrinsicType.If: return(new IfIntrinsicInfo(currentPath, intrinsic, null, intrinsic.Evaluate(this.template))); case IntrinsicType.Ref: return(this.ProcessRef((RefIntrinsic)intrinsic, currentPath)); case IntrinsicType.GetAtt: return(this.ProcessGetAtt((GetAttIntrinsic)intrinsic, currentPath)); case IntrinsicType.Base64: case IntrinsicType.Cidr: case IntrinsicType.FindInMap: case IntrinsicType.Join: case IntrinsicType.Select: case IntrinsicType.Split: case IntrinsicType.Sub: return(new IntrinsicInfo(currentPath, intrinsic, null, intrinsic.Evaluate(this.template))); case IntrinsicType.ImportValue: return(this.ProcessImportValue((ImportValueIntrinsic)intrinsic, currentPath)); default: throw new UnreferenceableIntrinsicWarning( intrinsic, this.currentCloudFormationResource, currentPath); } }
/// <summary> /// Gets the <see cref="IntrinsicInfo"/> attached to the ExtraData member during visit to the parsed CloudFormation template. /// </summary> /// <param name="self">The self.</param> /// <returns>The attached <see cref="IntrinsicInfo"/></returns> /// <exception cref="ArgumentNullException">Intrinsic cannot be null</exception> /// <exception cref="InvalidOperationException"> /// Cannot call GetInfo before running Dependency Resolver (which sets this) /// - or - /// Unexpected type on the ExtraData property of the intrinsic. /// </exception> public static IntrinsicInfo GetInfo(this IIntrinsic self) { if (self == null) { throw new ArgumentNullException(nameof(self)); } switch (self.ExtraData) { case null: throw new InvalidOperationException( $"{self.TagName}: Cannot call GetInfo before running Dependency Resolver"); case IntrinsicInfo info: return(info); default: throw new InvalidOperationException( $"{self.TagName}: Unexpected type {self.ExtraData.GetType().FullName} in ExtraData member."); } }
public void Add(IIntrinsic value) { Dict[value.Name] = value; }
/// <summary> /// Visits the specified intrinsic and dispatches to visit handler for each distinct subclass of <see cref="T:Firefly.CloudFormationParser.Intrinsics.IIntrinsic" />. /// </summary> /// <param name="intrinsic">The intrinsic.</param> /// <param name="context">The context.</param> protected override void Visit(IIntrinsic intrinsic, IntrinsicVisitorContext context) { context.EnterIntrinsic(intrinsic, this.Path); base.Visit(intrinsic, context); context.ExitIntrinsic(); }
/// <summary> /// Initializes a new instance of the <see cref="MissingExportWarning"/> class. /// </summary> /// <param name="intrinsic">The intrinsic being warned about.</param> /// <param name="containingResource">The resource that contains the errant intrinsic.</param> /// <param name="location">The the AWS property path to the intrinsic being warned about.</param> public MissingExportWarning(IIntrinsic intrinsic, IResource containingResource, PropertyPath location) : base(intrinsic, containingResource, location) { }
/// <summary> /// Renders this intrinsic to a <see cref="Reference"/> that can be embedded into the in-memory state file. /// </summary> /// <param name="self">The intrinsic being rendered.</param> /// <param name="template">Reference to CloudFormation template.</param> /// <param name="resource">Resource referenced by the intrinsic.</param> /// <param name="inputs">The list of input variables and data sources.</param> /// <param name="index">The index to add as an indexer on the generated reference.</param> /// <returns>A <see cref="Reference"/> or <c>null</c> if a reference cannot be created.</returns> /// <exception cref="System.ArgumentNullException">self cannot be null</exception> public static Reference Render( this IIntrinsic self, ITemplate template, ResourceMapping resource, IList <InputVariable> inputs, int index) { if (self == null) { throw new ArgumentNullException(nameof(self)); } Reference reference; switch (self) { case Base64Intrinsic base64Intrinsic: reference = Render(base64Intrinsic, template, resource, inputs); break; case CidrIntrinsic cidrIntrinsic: reference = Render(cidrIntrinsic, template, resource, inputs, index); break; case FindInMapIntrinsic findInMapIntrinsic: reference = Render(findInMapIntrinsic, template, resource, inputs, index); break; case GetAttIntrinsic getAttIntrinsic: reference = Render(getAttIntrinsic, template, resource); break; case GetAZsIntrinsic getAZsIntrinsic: reference = Render(getAZsIntrinsic, inputs, index); break; case ImportValueIntrinsic importValueIntrinsic: reference = Render(importValueIntrinsic, template, inputs); break; case JoinIntrinsic joinIntrinsic: reference = Render(joinIntrinsic, template, resource, inputs); break; case RefIntrinsic refIntrinsic: reference = Render(refIntrinsic, template, resource, index); break; case SelectIntrinsic selectIntrinsic: reference = Render(selectIntrinsic, template, resource, inputs); break; case SplitIntrinsic splitIntrinsic: reference = Render(splitIntrinsic, template, resource, inputs); break; case SubIntrinsic subIntrinsic: reference = Render(subIntrinsic, template, resource, inputs); break; default: throw new InvalidOperationException($"No renderer for '{self.TagName}'."); } if (reference != null) { return(reference); } throw new InvalidOperationException($"Failed rendering '{self.TagName}'."); }