This guide shows you how to create provider functions in Pyvider. Functions are callable operations that transform or validate data in Terraform configurations.
🤖 AI-Generated Content
This documentation was generated with AI assistance and is still being audited. Some, or potentially a lot, of this information may be inaccurate. Learn more.
Provider functions in Terraform:
- Transform data (string manipulation, JSON parsing, encoding)
- Validate inputs (check formats, constraints)
- Perform calculations (hashing, math operations)
- Are pure functions (no side effects, same input = same output)
frompyvider.functionsimportregister_function,BaseFunctionfrompyvider.schemaimports_function,a_str,PvsSchema@register_function("upper")classUpperFunction(BaseFunction):"""Converts a string to uppercase."""@classmethoddefget_schema(cls)->PvsSchema:"""Define function signature."""returns_function(parameters=[a_str(description="Input string to convert"),],return_type=a_str(description="Uppercase string"),)asyncdefcall(self,input:str)->str:"""Execute the function."""returninput.upper()
frompyvider.functionsimportregister_function,BaseFunctionfrompyvider.schemaimports_function,a_str,PvsSchema@register_function("join")classJoinFunction(BaseFunction):"""Joins strings with a separator."""@classmethoddefget_schema(cls)->PvsSchema:returns_function(parameters=[a_list(a_str(),description="Strings to join"),a_str(description="Separator"),],return_type=a_str(description="Joined string"),)asyncdefcall(self,strings:list[str],separator:str)->str:"""Join strings."""returnseparator.join(strings)
frompyvider.functionsimportregister_function,BaseFunctionfrompyvider.schemaimports_function,a_str,PvsSchemaimporthashlib@register_function("sha256")classSHA256Function(BaseFunction):"""Computes SHA256 hash of a string."""@classmethoddefget_schema(cls)->PvsSchema:returns_function(parameters=[a_str(description="Input string to hash"),],return_type=a_str(description="SHA256 hex digest"),)asyncdefcall(self,input:str)->str:"""Compute SHA256 hash."""returnhashlib.sha256(input.encode()).hexdigest()
frompyvider.functionsimportregister_function,BaseFunctionfrompyvider.schemaimports_function,a_str,a_bool,PvsSchemaimportre@register_function("is_valid_email")classValidateEmailFunction(BaseFunction):"""Validates an email address."""@classmethoddefget_schema(cls)->PvsSchema:returns_function(parameters=[a_str(description="Email address to validate"),],return_type=a_bool(description="Whether email is valid"),)asyncdefcall(self,email:str)->bool:"""Validate email format."""pattern=r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'returnbool(re.match(pattern,email))
frompyvider.functionsimportregister_function,BaseFunctionfrompyvider.schemaimports_function,a_num,PvsSchema@register_function("clamp")classClampFunction(BaseFunction):"""Clamps a number between min and max values."""@classmethoddefget_schema(cls)->PvsSchema:returns_function(parameters=[a_num(description="Input value"),a_num(description="Minimum value"),a_num(description="Maximum value"),],return_type=a_num(description="Clamped value"),)asyncdefcall(self,value:float,min_val:float,max_val:float)->float:"""Clamp value between min and max."""returnmax(min_val,min(max_val,value))
# Use the uppercase functionlocals{name=provider::local::upper("hello world") # Result: "HELLO WORLD"}# Use the join functionlocals{tags=provider::mycloud::join(["prod", "web", "api"], "-") # Result: "prod-web-api"}# Use the hash functionresource"mycloud_secret""api_key"{name="api-key"hash=provider::mycloud::sha256(var.api_key)}# Use validation functionvariable"admin_email"{type=stringvalidation{condition=provider::mycloud::is_valid_email(var.admin_email)error_message="Must be a valid email address"}}
frompyvider.functionsimportregister_function,BaseFunctionfrompyvider.exceptionsimportFunctionErrorfrompyvider.schemaimports_function,a_num,PvsSchema@register_function("divide")classDivideFunction(BaseFunction):"""Divides two numbers."""@classmethoddefget_schema(cls)->PvsSchema:returns_function(parameters=[a_num(description="Numerator"),a_num(description="Denominator"),],return_type=a_num(description="Result"),)asyncdefcall(self,numerator:float,denominator:float)->float:"""Divide two numbers."""ifdenominator==0:raiseFunctionError("Cannot divide by zero")returnnumerator/denominator
frompyvider.functionsimportregister_function,BaseFunctionfrompyvider.schemaimports_function,a_str,a_obj,a_num,a_bool,PvsSchema@register_function("parse_url")classParseURLFunction(BaseFunction):"""Parses a URL into components."""@classmethoddefget_schema(cls)->PvsSchema:returns_function(parameters=[a_str(description="URL to parse"),],return_type=a_obj({"scheme":a_str(description="URL scheme"),"host":a_str(description="Hostname"),"port":a_num(description="Port number"),"path":a_str(description="URL path"),"secure":a_bool(description="Whether HTTPS"),},description="Parsed URL components"),)asyncdefcall(self,url:str)->dict:"""Parse URL."""fromurllib.parseimporturlparseparsed=urlparse(url)return{"scheme":parsed.scheme,"host":parsed.hostnameor"","port":parsed.portor(443ifparsed.scheme=="https"else80),"path":parsed.pathor"/","secure":parsed.scheme=="https",}
frompyvider.functionsimportregister_function,BaseFunctionfrompyvider.schemaimports_function,a_str,PvsSchema@register_function("concat")classConcatFunction(BaseFunction):"""Concatenates any number of strings."""@classmethoddefget_schema(cls)->PvsSchema:returns_function(parameters=[a_str(description="String to concatenate"),],variadic_parameter=a_str(description="Additional strings"),return_type=a_str(description="Concatenated result"),)asyncdefcall(self,first:str,*rest:str)->str:"""Concatenate all strings."""returnfirst+"".join(rest)