Beispiel #1
0
 /// <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)
 {
 }
Beispiel #3
0
 /// <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)
 {
 }
Beispiel #4
0
 /// <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;
 }
Beispiel #5
0
 /// <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;
 }
Beispiel #6
0
        /// <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));
        }
Beispiel #7
0
        /// <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);
            }
        }
Beispiel #8
0
            /// <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;
                }
            }
Beispiel #9
0
            /// <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.");
            }
        }
Beispiel #11
0
 public void Add(IIntrinsic value)
 {
     Dict[value.Name] = value;
 }
Beispiel #12
0
 /// <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)
 {
 }
Beispiel #14
0
        /// <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}'.");
        }