tooling/ActionTypes/CheckResource.xscript.ps1


#:xheader:
#Type=ActionType;
#:xheader:

@{
    Clean = 
    {
        Param([ConfigAutomationContext] $context,[UIAction] $action)
        return $true
    };
    Action = 
    {
        Param([ConfigAutomationContext] $context,[UIAction] $action)
        
        $extracted = $action.Parameters().Extract(@("ResourceName", "ResourceType", "ResultType"))
        
        $result = $null
        if($($extracted.CheckType) -ieq "export"){
            $expression = $action.Parameters().Get("Expression").Value()
            
            $resource = Get-AzureRmResource -ODataQuery "`$filter=resourcetype eq '$($extracted.ResourceType)' and name eq '$($extracted.ResourceName)'" -ExpandProperties
            if(-not $resource){
                $context.Error("Resource '{white}$($extracted.ResourceName){gray}' of type '{white}$($extracted.ResourceType){gray}' was found, try using the check for exists aswell...")
                return $false
            }
            
            $command =  $expression
            $result = .$command
        }
        elseif($($extracted.CheckType)  -ieq "exists"){
            $resource = Get-AzureRmResource -ODataQuery "`$filter=resourcetype eq '$($extracted.ResourceType)' and name eq '$($extracted.ResourceName)'" -ExpandProperties
            if(-not $resource){
                $result = $false
            }
            else{
                $result = $true
            }
        }
        else{
            $context.Error("CheckType can only be one of the following values: ('{white}export{gray}', '{white}exists{gray}') but found {white}$($extracted.CheckType){gray}")
            return $false
        }
        
        
        if($extracted.ResultType -ieq "output"){
            $outputVariableName = $action.Parameters().Get("OutputVariableName").Value()
            $context.InjectOutputVariable($action, $outputVariableName, $result)
        }
        elseif($extracted.ResultType -ieq "validate"){
            $expression = $action.Parameters().Get("ValidateExpression").Value()
            $command =  $expression
            $finalResult = .$command
            
            if(-not ($finalResult -is [bool])){
                $context.Error("Expression resulted in a type that was not a [bool]. Something is wrong with your '{white}ValidateExpression{gray}'")
                return $false
            }
            
            if($finalResult -eq $false){
                $context.Error("Validation Expression resulted in False")
                return $false
            }
            
            return $true
        }
        else{
            $context.Error("ResultType can only be one of the following values: ('{white}Output{gray}', '{white}Validate{gray}') but found {white}$($extracted.ResultType){gray}")
            return $false
        }
        
        
        
        
        return $true
    };
    CanExecute = 
    {
        Param([ConfigAutomationContext] $context,[UIAction] $action)
        return $true
    };
    Validate = 
    {
        Param([ConfigAutomationContext] $context,[UIAction] $action)

        if(-not $action.Parameters().Validate(@("ResourceName", "ResourceType", "CheckType", "ResultType"))){
            return $false
        }
        
        $extracted = $action.Parameters().Extract(@("ResourceName", "ResourceType", "CheckType", "ResultType"))
        
        $isValid = $true
        if($extracted.CheckType -ieq "export"){
            if(-not $action.Parameters().Validate(@("Expression"))){
                $isValid = $false
            }
        }
        elseif($extracted.CheckType -ieq "exists"){
        }
        else{
            $context.Error("CheckType can only be one of the following values: ('{white}export{gray}', '{white}exists{gray}') but found {white}$($extracted.CheckType){gray}")
            $isValid = $false
        }
        
        
        if($extracted.ResultType -ieq "output"){
            if(-not $action.Parameters().Validate(@("OutputVariableName"))){
                $isValid = $false
            }
            $outputVariableName = $action.Parameters().Get("OutputVariableName").Value()
            $context.InjectOutputVariable($action, $outputVariableName, $false)
        }
        elseif($extracted.ResultType -ieq "validate"){
            if(-not $action.Parameters().Validate(@("ValidateExpression"))){
                $isValid = $false
            }
        }
        else{
            $context.Error("ResultType can only be one of the following values: ('{white}Output{gray}', '{white}Validate{gray}') but found {white}$($extracted.ResultType){gray}")
            $isValid = $false
        }
        
        
        return $isValid
    };
    
}