Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Blog post on terraform convert improvements #13777

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
352 changes: 352 additions & 0 deletions content/blog/pulumi-convert-terraform-improvements/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,352 @@
---
title: "Pulumi Convert Terraform Improvements"
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
date: 2025-01-08T14:47:13+09:00
meta_desc: "Pulumi convert now supports a number of enhancements and bug fixes for terraform, including automatically bridging providers"
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
meta_image: meta.png
authors:
- brandon-pollack
tags:
- terraform
- features
---

At Pulumi, we want to provide access to manage **any** cloud infrastructure
with a single unified programming model.
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
To that end, we've already added support for [any Terraform/OpenTofu provider](/home/brpol/src/pulumi/docs/content/blog/any-terraform-provider/).
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
This works great if you already have an existing pulumi project and want to
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
utilize some providers from the Terraform ecosystem that aren't yet available for
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
Pulumi natively! However, What if you are trying to move your already existing
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
Infrastructure as Code solution to Pulumi IaC?
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved

We already have a [handy
utility](/docs/using-pulumi/adopting-pulumi/migrating-to-pulumi/from-terraform/)
called `pulumi convert` built into the cli to convert terraform projects to any
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
Pulumi language, but up until now it didn't handle dependencies on external
terraform providers which don't have a known Pulumi native equivalent.
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved

We're happy to announce that with the release of [Pulumi
3.145](https://github.com/pulumi/pulumi/releases/tag/v3.145.0), we now support
the same automatic bridging we brought to existing Pulumi projects to projects
being converted from Terraform into Pulumi!

<!--more-->

## Quickstart

If you're anxious to try this out on your own Terraform codebase, you need only
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"anxious" -> "eager" (improper word use: "anxious" has a negative connotation, e.g. that you're worried or concerned about something, while "eager" has a positive connotation indicating excitement and an expectation of a good experience)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If you're anxious to try this out on your own Terraform codebase, you need only
If you're eager to try this out on your own Terraform codebase, you need only

to navigate to your project directory and run the following command with the
latest version of Pulumi installed:

{{% chooser language "javascript,typescript,python,go" %}}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this not work for yaml/dotnet/java?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it does but I havent gotten around to testing each of those (there are enough issues from various subtleties in the ones built into the repo). Figured I'd wait until it was out of draft stage and folks had a look at it, but I'm going to test/add them after that.


{{% choosable language javascript %}}

```shell
pulumi convert --from terraform --language nodejs
```

{{% /choosable %}}

{{% choosable language typescript %}}

```shell
pulumi convert --from terraform --language typescript
```

{{% /choosable %}}

{{% choosable language python %}}

```shell
pulumi convert --from terraform --language python
```

{{% /choosable %}}

{{% choosable language go %}}

```shell
pulumi convert --from terraform --language go
```

{{% /choosable %}}

{{% /chooser %}}

This will download the necessary converter and language plugins, run the
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
conversion and output it in the current directory, generating all necessary
project files.

If all went well you can run `pulumi preview` to see if the project can deploy
successfully. Truth be told, there are still [a few scenarios](#limitations)
where the conversion will succeed but the generated code needs a little bit of
attention before you're off to the races.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"off to the races" -> "ready to deploy" (avoid idioms that readers may not understand. imagine someone reading this and interpreting it literally. it would be very confusing.)


## Detailed Example

In order to illustrate the example further, I've thrown together a simple
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"i've thrown together" -> "we've provided" ("i" vs "we": this is a switch from the plural first person to the singular first person, which is inconsistent with the rest of the article. also "thrown together" is a another case of a idiom that might throw off a reader. even if they understand the idiom, it implies low quality and a lack of trustworthiness. better to use a more neutral term like "provided")

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"a simple Terraform project" -> "a Terraform project" (words like "simple" can be an emotional trigger. this example may not seem simple to new/inexperienced users and could make them feel embarrassed/overwhlemed if they don't understand something that is supposed to be "simple". it's better to avoid qualifier terms that might have an unintended opposite effect on the reader)

Terraform project that sets up a Google Compute Engine virtual machine, a
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Provide links to GCE/PlanetScale for those unfamiliar with them to explore.

Planetscale database, and wires them together. At the time of writing, there
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
is no Planetscale provider in the pulumi registry, and the project will specify
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"pulumi" -> "Pulumi" (capitalize proper nouns)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"... registry, and the ..." -> "... registry. The ..." (run on sentence)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Planetscale" -> "PlanetScale" (use correct capitalization for product name)

using a specific version of the Terraform provider.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"The project will specify using a specific version of" -> "The project will use a specific version of" (redundant use of "specify" conjugations)


Here is the terraform code in a single main.tf file:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"main.tf" -> "main.tf" (use code formatting for filenames)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"terraform" -> "Terraform" (capitalize proper nouns)


```terraform
terraform {
required_version = ">= 1.1.0"
required_providers {
google = {
source = "hashicorp/google"
version = "~> 6.0"
}
planetscale = {
source = "planetscale/planetscale"
version = "~> 0.1.0"
}
}
}
provider "google" {
project = var.gcp_project
region = var.gcp_region
zone = var.gcp_zone
}
provider "planetscale" {
service_token = var.planetscale_service_token
service_token_name = "planetscaletoken"
}
variable "gcp_project" {
description = "GCP project ID"
default = "pulumi-convert-example-gcp-project"
}
variable "gcp_region" {
description = "GCP region to use"
default = "us-central1"
}
variable "gcp_zone" {
description = "GCP zone"
default = "us-central1-a"
}
variable "planetscale_org" {
description = "PlanetScale organization name"
default = "pulumi-convert-planetscale-org"
}
variable "planetscale_service_token" {
description = "PlanetScale service token secret"
sensitive = true
default = "test-planetscale-service-token"
}
# Create the PlanetScale database
resource "planetscale_database" "db" {
name = "pulumi-convert-db"
organization = var.planetscale_org
}
# Generate a password for connecting to the DB
resource "planetscale_password" "db_password" {
organization = "brandonpollack23"
name = "terraform-generated"
database = planetscale_database.db.name
branch = planetscale_database.db.default_branch
}
# Spin up a small GCE VM
resource "google_compute_instance" "vm" {
name = "demo-vm"
machine_type = "e2-micro"
zone = var.gcp_zone
# Minimal Debian boot disk
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
# Use the default VPC with a public IP
network_interface {
network = "default"
access_config {}
}
# Pass PlanetScale connection info as metadata
metadata = {
DB_HOST = planetscale_database.db.url
DB_USER = "root"
DB_PASS = planetscale_password.db_password.plaintext
DB_NAME = planetscale_database.db.name
}
}
```

{{% notes type="warning" %}}
**Never** store secrets or keys in plain text in your code or commited
configuration files. I only have a db_password stored here in plain text for
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"... or commited configuration files." -> ".. or configuration files committed to a code repository." (ambiguous use of the term "committed". also misspelled)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"db_password" -> "db_password" (use code formatting for variable names)

the sake of readability.

Consider using [Pulumi ESC](https://www.pulumi.com/docs/esc/) to store these types of
secrets (and any other configuration!) and access them directly from your Pulumi programs.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"... store these types of secrets (and any other configuration!) and access them directly from ... " -> "... store and access these types of secrets and configuration values directly from ..." (simplify grammar)

{{% /notes %}}

This alone works if you run `terraform plan`, however without *real*
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"This alone works if you run ..." -> "This is all you need to run ..." (simplify grammar)

credentials nothing will really deploy, of course! You can set these in tfvars,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"will really deploy" -> "will deploy" (redundant use of conjugations of "real")

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"tfvars" -> ".tfvars" (use code formatting for filenames. also, provide a link to Terraform documentation for these files for unfamiliar users)

environmental variables, command line, etc.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"environmental variables" -> "environment variables" (this is a specific technical term not general language term, so we need to use the exact wording)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"command line" -> "command line parameters" (grammar: command line is an adjective here and needs a noun)


Even if you use a tfvars file, converting this is not currently supported, so
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"tfvars" -> ".tfvars" (use code formatting for filenames)

the configuration will need to be moved to stack files in your
new Pulumi project (eg `Pulumi.dev.yaml`, `Pulumi.prod.yaml`, etc).

You can convert this into a new project with the following command:

{{% chooser language "typescript,python,go" %}}

{{% choosable language typescript %}}

```shell
pulumi convert --from terraform --language typescript --out ts
```

I have opted to output it to a different directory to preserve the contents of my Terraform project.

### Project structure

If we navigate to the `ts` directory, we can see a few things:

- index.ts, our equivalent to main.tf for typescript projects
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"index.ts" & "main.tf" -> "index.ts" & "main.tf" (use code formatting for filenames)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"typescript" -> "TypeScript" (capitalize proper nouns)

- sdks directory, where the generated bridged provider is output
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"sdks directory" -> either "SDKs directory" (if we're talking about a type of directory) or "sdks directory if this is a specific directory name)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"is output" -> "is outputted" (grammar)

- other node project artifacts such as package.json, node_modules, tsconfig.json, etc.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"node" -> "Node.js" (use proper noun)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"package.json, node_modules, tsconfig.json" -> "package.json, node_modules, tsconfig.json" (use code formatting for filenames)


{{% /choosable %}}

{{% choosable language python %}}

```shell
pulumi convert --from terraform --language python --out python
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
```

I have opted to output it to a different directory to preserve the contents of my Terraform project.

### Project structure

If we navigate to the `python` directory, we can see a few things:

- \_\_main\_\_.py, our equivalent to main.tf for python projects
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"__main__.py" -> "__main__.py" (use code formatting for filenames)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"main.tf" -> "main.tf" (use code formatting for filenames)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"python" -> "Python" (capitalize proper nouns)

- sdks directory, where the generated bridged provider is output
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"sdks directory" -> either "SDKs directory" (if we're talking about a type of directory) or "sdks directory if this is a specific directory name)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"is output" -> "is outputted" (grammar)

- other python project artifacts (eg requirments.txt, pyproject.toml, etc)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"python" -> "Python" (capitalize proper nouns)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"(eg ... )" -> "such as ..." (consistent language with previous example)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"requirments.txt, pyproject.toml" -> "requirements.txt, pyproject.toml" (use code formatting for filenames, also "requirements" is misspelled)


### Python specific cleanup
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Python specific" -> "Python-specific" (grammar: should be hyphenated)


The python code generator may try to use subscript syntax inappropriately, so you may need to look through the generated code and switch certain things to dot access syntax like so:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"python" -> "Python" (capitalize proper nouns)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"syntax like so" -> "syntax, like so" (grammar: use comma to separate phrases)


```diff
metadata={
- "DB_HOST": db["url"],
+ "DB_HOST": db.url,
"DB_USER": "root",
- "DB_PASS": db_password["plaintext"],
- "DB_NAME": db["name"],
+ "DB_PASS": db_password.plaintext,
+ "DB_NAME": db.name,
}
```

{{% /choosable %}}

{{% choosable language go %}}

```shell
pulumi convert --from terraform --language go --out golang
```

I have opted to output it to a different directory to preserve the contents of my Terraform project.

### Project structure

If we navigate to the `golang` directory, we can see a few things:

- main.go, our equivalent to main.tf for golang projects
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"main.go, our equivalent to main.tf" -> "main.go, our equivalent to main.tf" (use code formatting for filenames)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"golang" -> "Go" or "Golang" (capitalize proper nouns)

- sdks directory, where the generated bridged provider is output
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"sdks directory" -> either "SDKs directory" (if we're talking about a type of directory) or "sdks directory if this is a specific directory name)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"is output" -> "is outputted" (grammar)

- other golang project artifacts (go.mod, go.sum)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"golang" -> "Go" or "Golang" (capitalize proper nouns)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"go.mod, go.sum" -> "go.mod, go.sum" (use code formatting for filenames)


### Go specific cleanup
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Go specific" -> "Go-specific" (grammar: hyphenate)


The go code generator outputs everything in the Terraform code, even if it is
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"go" -> "Go" (capitalize proper nouns)

unused. This is an error in a go program, so I had to manually remove
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"go" -> "Go" (capitalize proper nouns)

unreferenced variables like GCP project, region, and planetscale service token.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"like GCP project" -> "like the GCP project" (grammar: use definite article)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"planetscale" -> "PlanetScale" (capitalize proper nouns)


These are part of the output because in it's current iteration the code
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"it's" -> "its" (grammar: use correct possessive form)

converter will convert everything, even if ultimately it is provider
configuration (see [cleanup](#cleanup)) and not actual code.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"provider configuration (see cleanup) and not actual code." -> "provider configuration and not actual code (see cleanup)." (grammar: parenthetical interjection should not break up the phrase)


{{% /choosable %}}

{{% /chooser %}}

### Cleanup

If we simply run `pulumi preview` this project unfortunately won't run right away.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"simply run" -> "run" (grammar: incorrect word use)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"project unfortunately won't run right away." -> "project won't run as it is." (simplify grammar)

We need to create our stack configuration that contains the GCP and Planetscale credentials.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"create our stack configuration" -> "create a stack configuration" (grammar: word use)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Planetscale" -> "PlanetScale" (use proper capitalization for product names)


These were part of our `main.tf` file, but the code generator doesn't
distinguish between provider config and code, so we need to handle this
part on our own (for now).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"(for now)" ... if it exists, link "for now" to a GH issue or other public documentation about the planned changes that would make this manual step unnecessary.


These can go in either your `Pulumi.yaml` or your stack configuration. Places
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Places" -> "Placeholders" (grammar: word use)

for them are already generated, you just need to fill them in:

```yaml
name: terraform-convert-example
runtime: nodejs
config:
google:project:
value: 'TODO: var.gcp_project' # fill in here
google:region:
value: 'TODO: var.gcp_region'
google:zone:
value: 'TODO: var.gcp_zone'
planetscale:serviceToken:
value: 'TODO: var.planetscale_service_token'
planetscale:serviceTokenName:
value: planetscaletoken
```
Also notice the configuration names differ from the pulumi counterparts "google" should be "gcp".
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"pulumi" -> "Pulumi" (capitalize proper nouns)

After filling things in the `Pulumi.yaml` should look something like this:

```yaml
name: terraform-convert-example
runtime: nodejs
config:
gcp:project:
value: 'brandonpollack23'
gcp:region:
value: 'us-central1'
gcp:zone:
value: 'us-central1-a'
planetscale:serviceToken:
value: 'supersecrettoken'
planetscale:serviceTokenName:
value: planetscaletoken
```

and if you run `pulumi preview` it successfully generates a plan!

There is still more you can do, the generated code could be cleaned up some as there
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"cleaned up some" -> "cleaned up" (grammar: remove redundant word)

are some unused variables, etc.

## Limitations
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved

* We still have a bit of [unimplemented Terraform functionality](https://github.com/pulumi/pulumi-converter-terraform/issues/65) that we're tracking and are evaluating how to move forward. For now when these functions are detected it will require some manual intervention on the converted project before you're ready to deploy.
* If you define your terraform module in a parent directory of your deployment code, you'll encounter a [known bug](https://github.com/pulumi/pulumi-converter-terraform/issues/194), but a simple workaround is to restructure your Terraform code before running a conversion.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"terraform" -> "Terraform" (capitalize proper nouns)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"a simple workaround" -> "a workaround" (remove "simple")

* Terraform programs are dynamically typed, when converting to a type safe language sometimes a type is unknown and still needs to be added manually (as in the typescript example above).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"dynamically typed, when" -> "dynamically typed. When" (grammar, break up run-on sentence)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"type safe" -> "type-safe" (hyphenate to use as adjective)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"still needs to" -> "needs to" (simplify grammar)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"typescript" -> "TypeScript" (capitalize proper nouns)

* Variables/Configuration are not yet converted automatically, so tfvars files etc will need to be manually converted into pulumi stack configurations.
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
brandonpollack23 marked this conversation as resolved.
Show resolved Hide resolved
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions data/team/team/brandon-pollack.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
id = "brandon-pollack"
name = "Brandon Pollack"

status = "active"

[social]
github = "brandonpollack23"
linkedin = "brandon-pollack-58b61542"
Binary file added static/images/team/brandon-pollack.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading