| 5638 | } |
| 5639 | |
| 5640 | pub async fn provider_update( |
| 5641 | server: &str, |
| 5642 | name: &str, |
| 5643 | from_existing: bool, |
| 5644 | credentials: &[String], |
| 5645 | config: &[String], |
| 5646 | credential_expires_at: &[String], |
| 5647 | tls: &TlsOptions, |
| 5648 | ) -> Result<()> { |
| 5649 | if from_existing && !credentials.is_empty() { |
| 5650 | return Err(miette::miette!( |
| 5651 | "--from-existing cannot be combined with --credential" |
| 5652 | )); |
| 5653 | } |
| 5654 | |
| 5655 | let mut client = grpc_client(server, tls).await?; |
| 5656 | |
| 5657 | let mut credential_map = parse_credential_pairs(credentials)?; |
| 5658 | let mut config_map = parse_key_value_pairs(config, "--config")?; |
| 5659 | let credential_expires_at_ms = parse_credential_expiry_pairs(credential_expires_at)?; |
| 5660 | |
| 5661 | if from_existing { |
| 5662 | // Fetch the existing provider to discover its type for credential lookup. |
| 5663 | let existing = client |
| 5664 | .get_provider(GetProviderRequest { |
| 5665 | name: name.to_string(), |
| 5666 | }) |
| 5667 | .await |
| 5668 | .into_diagnostic()? |
| 5669 | .into_inner() |
| 5670 | .provider |
| 5671 | .ok_or_else(|| miette::miette!("provider '{name}' not found"))?; |
| 5672 | |
| 5673 | let provider_type = existing.r#type; |
| 5674 | let discovered = discover_existing_provider_data(&mut client, &provider_type).await?; |
| 5675 | let Some(discovered) = discovered else { |
| 5676 | return Err(miette::miette!( |
| 5677 | "no existing local credentials/config found for provider type '{provider_type}'" |
| 5678 | )); |
| 5679 | }; |
| 5680 | |
| 5681 | for (key, value) in discovered.credentials { |
| 5682 | credential_map.entry(key).or_insert(value); |
| 5683 | } |
| 5684 | for (key, value) in discovered.config { |
| 5685 | config_map.entry(key).or_insert(value); |
| 5686 | } |
| 5687 | } |
| 5688 | |
| 5689 | let response = client |
| 5690 | .update_provider(UpdateProviderRequest { |
| 5691 | provider: Some(Provider { |
| 5692 | metadata: Some(openshell_core::proto::datamodel::v1::ObjectMeta { |
| 5693 | id: String::new(), |
| 5694 | name: name.to_string(), |
| 5695 | created_at_ms: 0, |
| 5696 | labels: HashMap::new(), |
| 5697 | resource_version: 0, |