First steps to pangolin provider
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/target
|
||||||
|
/proto/googleapis
|
||||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "googleapis"]
|
||||||
|
path = googleapis
|
||||||
|
url = https://github.com/googleapis/googleapis
|
||||||
1752
Cargo.lock
generated
Normal file
1752
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
15
Cargo.toml
Normal file
15
Cargo.toml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
[package]
|
||||||
|
name = "terraform-provider-pangolin"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
anyhow = "1.0.102"
|
||||||
|
async-trait = "0.1.89"
|
||||||
|
serde = { version = "1.0.228", features = ["serde_derive"] }
|
||||||
|
serde_json = "1.0.149"
|
||||||
|
tf-provider = "0.2.2"
|
||||||
|
tokio = { version = "1.50.0", features = ["full"] }
|
||||||
|
|
||||||
|
# [patch.crates-io]
|
||||||
|
# tf-provider = { path = "../../tf-provider" }
|
||||||
1
src/data.rs
Normal file
1
src/data.rs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
3
src/lib.rs
Normal file
3
src/lib.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
pub mod data;
|
||||||
|
pub mod provider;
|
||||||
|
pub mod resource;
|
||||||
8
src/main.rs
Normal file
8
src/main.rs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
use anyhow::Result;
|
||||||
|
use terraform_provider_pangolin::provider::PangolinProvider;
|
||||||
|
use tf_provider::Provider;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<()> {
|
||||||
|
tf_provider::serve("pangolin", PangolinProvider).await
|
||||||
|
}
|
||||||
56
src/provider.rs
Normal file
56
src/provider.rs
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use async_trait::async_trait;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use tf_provider::{
|
||||||
|
Diagnostics, DynamicDataSource, DynamicFunction, DynamicResource, Provider, map,
|
||||||
|
schema::{Attribute, AttributeConstraint, AttributeType, Block, Description, Schema},
|
||||||
|
value::{ValueEmpty, ValueString},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub struct PangolinProvider;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct PangolinConfig {
|
||||||
|
base_url: String,
|
||||||
|
api_token: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl Provider for PangolinProvider {
|
||||||
|
type Config<'a> = PangolinConfig;
|
||||||
|
type MetaState<'a> = ValueEmpty;
|
||||||
|
|
||||||
|
fn get_resources(
|
||||||
|
&self,
|
||||||
|
_diags: &mut Diagnostics,
|
||||||
|
) -> Option<HashMap<String, Box<dyn DynamicResource>>> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn schema(&self, _diags: &mut Diagnostics) -> Option<Schema> {
|
||||||
|
Some(Schema {
|
||||||
|
version: 1,
|
||||||
|
block: Block {
|
||||||
|
description: Description::plain("Pangolin Provider"),
|
||||||
|
attributes: map! {
|
||||||
|
"base_url" => Attribute {
|
||||||
|
attr_type: AttributeType::String,
|
||||||
|
description: Description::plain("The base URL for the API endpoint of the pangolin server. i.e. https://api.pangolin.com/v1"),
|
||||||
|
constraint: AttributeConstraint::Optional,
|
||||||
|
sensitive: false,
|
||||||
|
deprecated: false,
|
||||||
|
},
|
||||||
|
"api_token" => Attribute {
|
||||||
|
attr_type: AttributeType::String,
|
||||||
|
description: Description::plain("The API token for the API integration."),
|
||||||
|
constraint: AttributeConstraint::Optional,
|
||||||
|
sensitive: true,
|
||||||
|
deprecated: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
5
src/resource.rs
Normal file
5
src/resource.rs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#[expect(clippy::module_inception)]
|
||||||
|
pub mod resource;
|
||||||
|
pub mod rule;
|
||||||
|
pub mod site_resource;
|
||||||
|
pub mod target;
|
||||||
120
src/resource/resource.rs
Normal file
120
src/resource/resource.rs
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
use async_trait::async_trait;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use tf_provider::{
|
||||||
|
AttributePath, Diagnostics, Resource as TfResource, schema::Schema, value::ValueEmpty,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Default, Debug, Clone, Copy)]
|
||||||
|
pub struct Resource;
|
||||||
|
|
||||||
|
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct ResourceState {}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl TfResource for Resource {
|
||||||
|
type State<'a> = ResourceState;
|
||||||
|
type PrivateState<'a> = ValueEmpty;
|
||||||
|
type ProviderMetaState<'a> = ValueEmpty;
|
||||||
|
|
||||||
|
fn schema(&self, diags: &mut Diagnostics) -> Option<Schema> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn validate<'a>(&self, diags: &mut Diagnostics, config: Self::State<'a>) -> Option<()> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn read<'a>(
|
||||||
|
&self,
|
||||||
|
diags: &mut Diagnostics,
|
||||||
|
state: Self::State<'a>,
|
||||||
|
private_state: Self::PrivateState<'a>,
|
||||||
|
provider_meta_state: Self::ProviderMetaState<'a>,
|
||||||
|
) -> Option<(Self::State<'a>, Self::PrivateState<'a>)> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn plan_create<'a>(
|
||||||
|
&self,
|
||||||
|
diags: &mut Diagnostics,
|
||||||
|
proposed_state: Self::State<'a>,
|
||||||
|
config_state: Self::State<'a>,
|
||||||
|
provider_meta_state: Self::ProviderMetaState<'a>,
|
||||||
|
) -> Option<(Self::State<'a>, Self::PrivateState<'a>)> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn plan_update<'a>(
|
||||||
|
&self,
|
||||||
|
diags: &mut Diagnostics,
|
||||||
|
prior_state: Self::State<'a>,
|
||||||
|
proposed_state: Self::State<'a>,
|
||||||
|
config_state: Self::State<'a>,
|
||||||
|
prior_private_state: Self::PrivateState<'a>,
|
||||||
|
provider_meta_state: Self::ProviderMetaState<'a>,
|
||||||
|
) -> Option<(Self::State<'a>, Self::PrivateState<'a>, Vec<AttributePath>)> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn plan_destroy<'a>(
|
||||||
|
&self,
|
||||||
|
diags: &mut Diagnostics,
|
||||||
|
prior_state: Self::State<'a>,
|
||||||
|
prior_private_state: Self::PrivateState<'a>,
|
||||||
|
provider_meta_state: Self::ProviderMetaState<'a>,
|
||||||
|
) -> Option<Self::PrivateState<'a>> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn create<'a>(
|
||||||
|
&self,
|
||||||
|
diags: &mut Diagnostics,
|
||||||
|
planned_state: Self::State<'a>,
|
||||||
|
config_state: Self::State<'a>,
|
||||||
|
planned_private_state: Self::PrivateState<'a>,
|
||||||
|
provider_meta_state: Self::ProviderMetaState<'a>,
|
||||||
|
) -> Option<(Self::State<'a>, Self::PrivateState<'a>)> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn update<'a>(
|
||||||
|
&self,
|
||||||
|
diags: &mut Diagnostics,
|
||||||
|
prior_state: Self::State<'a>,
|
||||||
|
planned_state: Self::State<'a>,
|
||||||
|
config_state: Self::State<'a>,
|
||||||
|
planned_private_state: Self::PrivateState<'a>,
|
||||||
|
provider_meta_state: Self::ProviderMetaState<'a>,
|
||||||
|
) -> Option<(Self::State<'a>, Self::PrivateState<'a>)> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn destroy<'a>(
|
||||||
|
&self,
|
||||||
|
diags: &mut Diagnostics,
|
||||||
|
prior_state: Self::State<'a>,
|
||||||
|
planned_private_state: Self::PrivateState<'a>,
|
||||||
|
provider_meta_state: Self::ProviderMetaState<'a>,
|
||||||
|
) -> Option<()> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn import<'a>(
|
||||||
|
&self,
|
||||||
|
diags: &mut Diagnostics,
|
||||||
|
_id: String,
|
||||||
|
) -> Option<(Self::State<'a>, Self::PrivateState<'a>)> {
|
||||||
|
diags.root_error_short("Import is not supported");
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
// async fn upgrade<'a>(
|
||||||
|
// &self,
|
||||||
|
// diags: &mut Diagnostics,
|
||||||
|
// _version: i64,
|
||||||
|
// _prior_state: RawValue,
|
||||||
|
// ) -> Option<Self::State<'a>> {
|
||||||
|
// diags.root_error_short("Upgrade is not supported");
|
||||||
|
// None
|
||||||
|
// }
|
||||||
|
}
|
||||||
1
src/resource/rule.rs
Normal file
1
src/resource/rule.rs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
1
src/resource/site_resource.rs
Normal file
1
src/resource/site_resource.rs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
1
src/resource/target.rs
Normal file
1
src/resource/target.rs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
Reference in New Issue
Block a user