Viewing docs for Azure DevOps v3.16.0
published on Friday, Jul 17, 2026 by Pulumi
published on Friday, Jul 17, 2026 by Pulumi
Viewing docs for Azure DevOps v3.16.0
published on Friday, Jul 17, 2026 by Pulumi
published on Friday, Jul 17, 2026 by Pulumi
Use this data source to query a specific service endpoint type and retrieve its parameters and authorization schemes.
Example Usage
Basic usage - Get service endpoint type information
import * as pulumi from "@pulumi/pulumi";
import * as azuredevops from "@pulumi/azuredevops";
const generic = azuredevops.getServiceendpointType({
name: "generic",
});
export const genericTypeInfo = {
displayName: generic.then(generic => generic.displayName),
authSchemes: generic.then(generic => generic.authenticationSchemes),
parameters: generic.then(generic => generic.parameters),
};
import pulumi
import pulumi_azuredevops as azuredevops
generic = azuredevops.get_serviceendpoint_type(name="generic")
pulumi.export("genericTypeInfo", {
"displayName": generic.display_name,
"authSchemes": generic.authentication_schemes,
"parameters": generic.parameters,
})
package main
import (
"github.com/pulumi/pulumi-azuredevops/sdk/v3/go/azuredevops"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
generic, err := azuredevops.GetServiceendpointType(ctx, &azuredevops.GetServiceendpointTypeArgs{
Name: "generic",
}, nil)
if err != nil {
return err
}
ctx.Export("genericTypeInfo", pulumi.Map{
"displayName": generic.DisplayName,
"authSchemes": generic.AuthenticationSchemes,
"parameters": generic.Parameters,
})
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureDevOps = Pulumi.AzureDevOps;
return await Deployment.RunAsync(() =>
{
var generic = AzureDevOps.GetServiceendpointType.Invoke(new()
{
Name = "generic",
});
return new Dictionary<string, object?>
{
["genericTypeInfo"] =
{
{ "displayName", generic.Apply(getServiceendpointTypeResult => getServiceendpointTypeResult.DisplayName) },
{ "authSchemes", generic.Apply(getServiceendpointTypeResult => getServiceendpointTypeResult.AuthenticationSchemes) },
{ "parameters", generic.Apply(getServiceendpointTypeResult => getServiceendpointTypeResult.Parameters) },
},
};
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azuredevops.AzuredevopsFunctions;
import com.pulumi.azuredevops.inputs.GetServiceendpointTypeArgs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
final var generic = AzuredevopsFunctions.getServiceendpointType(GetServiceendpointTypeArgs.builder()
.name("generic")
.build());
ctx.export("genericTypeInfo", Map.ofEntries(
Map.entry("displayName", generic.displayName()),
Map.entry("authSchemes", generic.authenticationSchemes()),
Map.entry("parameters", generic.parameters())
));
}
}
variables:
generic:
fn::invoke:
function: azuredevops:getServiceendpointType
arguments:
name: generic
outputs:
genericTypeInfo:
displayName: ${generic.displayName}
authSchemes: ${generic.authenticationSchemes}
parameters: ${generic.parameters}
pulumi {
required_providers {
azuredevops = {
source = "pulumi/azuredevops"
}
}
}
data "azuredevops_getserviceendpointtype" "generic" {
name = "generic"
}
output "genericTypeInfo" {
value = {
"displayName" = data.azuredevops_getserviceendpointtype.generic.display_name
"authSchemes" = data.azuredevops_getserviceendpointtype.generic.authentication_schemes
"parameters" = data.azuredevops_getserviceendpointtype.generic.parameters
}
}
Get authorization parameters for a specific auth scheme
import * as pulumi from "@pulumi/pulumi";
import * as azuredevops from "@pulumi/azuredevops";
const generic = azuredevops.getServiceendpointType({
name: "generic",
authorizationScheme: "UsernamePassword",
});
export const authParameters = generic.then(generic => generic.authorizationParameters);
import pulumi
import pulumi_azuredevops as azuredevops
generic = azuredevops.get_serviceendpoint_type(name="generic",
authorization_scheme="UsernamePassword")
pulumi.export("authParameters", generic.authorization_parameters)
package main
import (
"github.com/pulumi/pulumi-azuredevops/sdk/v3/go/azuredevops"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
generic, err := azuredevops.GetServiceendpointType(ctx, &azuredevops.GetServiceendpointTypeArgs{
Name: "generic",
AuthorizationScheme: pulumi.StringRef("UsernamePassword"),
}, nil)
if err != nil {
return err
}
ctx.Export("authParameters", generic.AuthorizationParameters)
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureDevOps = Pulumi.AzureDevOps;
return await Deployment.RunAsync(() =>
{
var generic = AzureDevOps.GetServiceendpointType.Invoke(new()
{
Name = "generic",
AuthorizationScheme = "UsernamePassword",
});
return new Dictionary<string, object?>
{
["authParameters"] = generic.Apply(getServiceendpointTypeResult => getServiceendpointTypeResult.AuthorizationParameters),
};
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azuredevops.AzuredevopsFunctions;
import com.pulumi.azuredevops.inputs.GetServiceendpointTypeArgs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
final var generic = AzuredevopsFunctions.getServiceendpointType(GetServiceendpointTypeArgs.builder()
.name("generic")
.authorizationScheme("UsernamePassword")
.build());
ctx.export("authParameters", generic.authorizationParameters());
}
}
variables:
generic:
fn::invoke:
function: azuredevops:getServiceendpointType
arguments:
name: generic
authorizationScheme: UsernamePassword
outputs:
authParameters: ${generic.authorizationParameters}
pulumi {
required_providers {
azuredevops = {
source = "pulumi/azuredevops"
}
}
}
data "azuredevops_getserviceendpointtype" "generic" {
name = "generic"
authorization_scheme = "UsernamePassword"
}
output "authParameters" {
value = data.azuredevops_getserviceendpointtype.generic.authorization_parameters
}
Use in service endpoint resource
import * as pulumi from "@pulumi/pulumi";
import * as azuredevops from "@pulumi/azuredevops";
const bitbucket = azuredevops.getServiceendpointType({
name: "bitbucket",
authorizationScheme: "UsernamePassword",
});
const example = new azuredevops.Project("example", {name: "Example Project"});
// Use the data source to understand available parameters
const exampleServiceendpointGenericV2 = new azuredevops.ServiceendpointGenericV2("example", {
projectId: example.id,
name: "Example Bitbucket",
description: "Managed by Pulumi",
type: bitbucket.then(bitbucket => bitbucket.name),
serverUrl: "https://bitbucket.org",
authorizationScheme: bitbucket.then(bitbucket => bitbucket.authorizationScheme),
authorizationParameters: {
username: "my-username",
password: "my-password",
},
});
import pulumi
import pulumi_azuredevops as azuredevops
bitbucket = azuredevops.get_serviceendpoint_type(name="bitbucket",
authorization_scheme="UsernamePassword")
example = azuredevops.Project("example", name="Example Project")
# Use the data source to understand available parameters
example_serviceendpoint_generic_v2 = azuredevops.ServiceendpointGenericV2("example",
project_id=example.id,
name="Example Bitbucket",
description="Managed by Pulumi",
type=bitbucket.name,
server_url="https://bitbucket.org",
authorization_scheme=bitbucket.authorization_scheme,
authorization_parameters={
"username": "my-username",
"password": "my-password",
})
package main
import (
"github.com/pulumi/pulumi-azuredevops/sdk/v3/go/azuredevops"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
bitbucket, err := azuredevops.GetServiceendpointType(ctx, &azuredevops.GetServiceendpointTypeArgs{
Name: "bitbucket",
AuthorizationScheme: pulumi.StringRef("UsernamePassword"),
}, nil)
if err != nil {
return err
}
example, err := azuredevops.NewProject(ctx, "example", &azuredevops.ProjectArgs{
Name: pulumi.String("Example Project"),
})
if err != nil {
return err
}
// Use the data source to understand available parameters
_, err = azuredevops.NewServiceendpointGenericV2(ctx, "example", &azuredevops.ServiceendpointGenericV2Args{
ProjectId: example.ID(),
Name: pulumi.String("Example Bitbucket"),
Description: pulumi.String("Managed by Pulumi"),
Type: pulumi.String(bitbucket.Name),
ServerUrl: pulumi.String("https://bitbucket.org"),
AuthorizationScheme: pulumi.String(bitbucket.AuthorizationScheme),
AuthorizationParameters: pulumi.StringMap{
"username": pulumi.String("my-username"),
"password": pulumi.String("my-password"),
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureDevOps = Pulumi.AzureDevOps;
return await Deployment.RunAsync(() =>
{
var bitbucket = AzureDevOps.GetServiceendpointType.Invoke(new()
{
Name = "bitbucket",
AuthorizationScheme = "UsernamePassword",
});
var example = new AzureDevOps.Project("example", new()
{
Name = "Example Project",
});
// Use the data source to understand available parameters
var exampleServiceendpointGenericV2 = new AzureDevOps.ServiceendpointGenericV2("example", new()
{
ProjectId = example.Id,
Name = "Example Bitbucket",
Description = "Managed by Pulumi",
Type = bitbucket.Apply(getServiceendpointTypeResult => getServiceendpointTypeResult.Name),
ServerUrl = "https://bitbucket.org",
AuthorizationScheme = bitbucket.Apply(getServiceendpointTypeResult => getServiceendpointTypeResult.AuthorizationScheme),
AuthorizationParameters =
{
{ "username", "my-username" },
{ "password", "my-password" },
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azuredevops.AzuredevopsFunctions;
import com.pulumi.azuredevops.inputs.GetServiceendpointTypeArgs;
import com.pulumi.azuredevops.Project;
import com.pulumi.azuredevops.ProjectArgs;
import com.pulumi.azuredevops.ServiceendpointGenericV2;
import com.pulumi.azuredevops.ServiceendpointGenericV2Args;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
final var bitbucket = AzuredevopsFunctions.getServiceendpointType(GetServiceendpointTypeArgs.builder()
.name("bitbucket")
.authorizationScheme("UsernamePassword")
.build());
var example = new Project("example", ProjectArgs.builder()
.name("Example Project")
.build());
// Use the data source to understand available parameters
var exampleServiceendpointGenericV2 = new ServiceendpointGenericV2("exampleServiceendpointGenericV2", ServiceendpointGenericV2Args.builder()
.projectId(example.id())
.name("Example Bitbucket")
.description("Managed by Pulumi")
.type(bitbucket.name())
.serverUrl("https://bitbucket.org")
.authorizationScheme(bitbucket.authorizationScheme())
.authorizationParameters(Map.ofEntries(
Map.entry("username", "my-username"),
Map.entry("password", "my-password")
))
.build());
}
}
resources:
example:
type: azuredevops:Project
properties:
name: Example Project
# Use the data source to understand available parameters
exampleServiceendpointGenericV2:
type: azuredevops:ServiceendpointGenericV2
name: example
properties:
projectId: ${example.id}
name: Example Bitbucket
description: Managed by Pulumi
type: ${bitbucket.name}
serverUrl: https://bitbucket.org
authorizationScheme: ${bitbucket.authorizationScheme}
authorizationParameters:
username: my-username
password: my-password
variables:
bitbucket:
fn::invoke:
function: azuredevops:getServiceendpointType
arguments:
name: bitbucket
authorizationScheme: UsernamePassword
pulumi {
required_providers {
azuredevops = {
source = "pulumi/azuredevops"
}
}
}
data "azuredevops_getserviceendpointtype" "bitbucket" {
name = "bitbucket"
authorization_scheme = "UsernamePassword"
}
resource "azuredevops_project" "example" {
name = "Example Project"
}
# Use the data source to understand available parameters
resource "azuredevops_serviceendpointgenericv2" "example" {
project_id = azuredevops_project.example.id
name = "Example Bitbucket"
description = "Managed by Pulumi"
type = data.azuredevops_getserviceendpointtype.bitbucket.name
server_url = "https://bitbucket.org"
authorization_scheme = data.azuredevops_getserviceendpointtype.bitbucket.authorization_scheme
authorization_parameters = {
"username" = "my-username"
"password" = "my-password"
}
}
Relevant Links
Using getServiceendpointType
Two invocation forms are available. The direct form accepts plain arguments and either blocks until the result value is available, or returns a Promise-wrapped result. The output form accepts Input-wrapped arguments and returns an Output-wrapped result.
function getServiceendpointType(args: GetServiceendpointTypeArgs, opts?: InvokeOptions): Promise<GetServiceendpointTypeResult>
function getServiceendpointTypeOutput(args: GetServiceendpointTypeOutputArgs, opts?: InvokeOptions): Output<GetServiceendpointTypeResult>def get_serviceendpoint_type(authorization_scheme: Optional[str] = None,
name: Optional[str] = None,
opts: Optional[InvokeOptions] = None) -> GetServiceendpointTypeResult
def get_serviceendpoint_type_output(authorization_scheme: pulumi.Input[Optional[str]] = None,
name: pulumi.Input[Optional[str]] = None,
opts: Optional[InvokeOptions] = None) -> Output[GetServiceendpointTypeResult]func GetServiceendpointType(ctx *Context, args *GetServiceendpointTypeArgs, opts ...InvokeOption) (*GetServiceendpointTypeResult, error)
func GetServiceendpointTypeOutput(ctx *Context, args *GetServiceendpointTypeOutputArgs, opts ...InvokeOption) GetServiceendpointTypeResultOutput> Note: This function is named GetServiceendpointType in the Go SDK.
public static class GetServiceendpointType
{
public static Task<GetServiceendpointTypeResult> InvokeAsync(GetServiceendpointTypeArgs args, InvokeOptions? opts = null)
public static Output<GetServiceendpointTypeResult> Invoke(GetServiceendpointTypeInvokeArgs args, InvokeOptions? opts = null)
}public static CompletableFuture<GetServiceendpointTypeResult> getServiceendpointType(GetServiceendpointTypeArgs args, InvokeOptions options)
public static Output<GetServiceendpointTypeResult> getServiceendpointType(GetServiceendpointTypeArgs args, InvokeOptions options)
fn::invoke:
function: azuredevops:index/getServiceendpointType:getServiceendpointType
arguments:
# arguments dictionarydata "azuredevops_get_serviceendpoint_type" "name" {
# arguments
}The following arguments are supported:
- Name string
- The name of the service endpoint type to query.
- string
- The authorization scheme to retrieve parameters for. When provided, the
authorizationParametersoutput will be populated with the parameters specific to this authentication scheme.
- Name string
- The name of the service endpoint type to query.
- string
- The authorization scheme to retrieve parameters for. When provided, the
authorizationParametersoutput will be populated with the parameters specific to this authentication scheme.
- name string
- The name of the service endpoint type to query.
- string
- The authorization scheme to retrieve parameters for. When provided, the
authorizationParametersoutput will be populated with the parameters specific to this authentication scheme.
- name String
- The name of the service endpoint type to query.
- String
- The authorization scheme to retrieve parameters for. When provided, the
authorizationParametersoutput will be populated with the parameters specific to this authentication scheme.
- name string
- The name of the service endpoint type to query.
- string
- The authorization scheme to retrieve parameters for. When provided, the
authorizationParametersoutput will be populated with the parameters specific to this authentication scheme.
- name str
- The name of the service endpoint type to query.
- str
- The authorization scheme to retrieve parameters for. When provided, the
authorizationParametersoutput will be populated with the parameters specific to this authentication scheme.
- name String
- The name of the service endpoint type to query.
- String
- The authorization scheme to retrieve parameters for. When provided, the
authorizationParametersoutput will be populated with the parameters specific to this authentication scheme.
getServiceendpointType Result
The following output properties are available:
- Authentication
Schemes List<string> - A list of available authentication schemes for this service endpoint type.
-
List<Pulumi.
Azure Dev Ops. Outputs. Get Serviceendpoint Type Authorization Parameter> - A list of authorization parameter descriptors. Only populated when
authorizationSchemeis provided. Each element has: - Description string
- The description of the service endpoint type.
- Display
Name string - The display name of the service endpoint type.
- Id string
- The provider-assigned unique ID for this managed resource.
- Name string
- The authorization parameter name (descriptor ID).
- Parameters
List<Pulumi.
Azure Dev Ops. Outputs. Get Serviceendpoint Type Parameter> - A list of parameter descriptors. Each element has:
- Ui
Contribution stringId - The UI contribution ID for this service endpoint type.
- string
- Authentication
Schemes []string - A list of available authentication schemes for this service endpoint type.
-
[]Get
Serviceendpoint Type Authorization Parameter - A list of authorization parameter descriptors. Only populated when
authorizationSchemeis provided. Each element has: - Description string
- The description of the service endpoint type.
- Display
Name string - The display name of the service endpoint type.
- Id string
- The provider-assigned unique ID for this managed resource.
- Name string
- The authorization parameter name (descriptor ID).
- Parameters
[]Get
Serviceendpoint Type Parameter - A list of parameter descriptors. Each element has:
- Ui
Contribution stringId - The UI contribution ID for this service endpoint type.
- string
- authentication_
schemes list(string) - A list of available authentication schemes for this service endpoint type.
- list(object)
- A list of authorization parameter descriptors. Only populated when
authorizationSchemeis provided. Each element has: - description string
- The description of the service endpoint type.
- display_
name string - The display name of the service endpoint type.
- id string
- The provider-assigned unique ID for this managed resource.
- name string
- The authorization parameter name (descriptor ID).
- parameters list(object)
- A list of parameter descriptors. Each element has:
- ui_
contribution_ stringid - The UI contribution ID for this service endpoint type.
- string
- authentication
Schemes List<String> - A list of available authentication schemes for this service endpoint type.
-
List<Get
Serviceendpoint Type Authorization Parameter> - A list of authorization parameter descriptors. Only populated when
authorizationSchemeis provided. Each element has: - description String
- The description of the service endpoint type.
- display
Name String - The display name of the service endpoint type.
- id String
- The provider-assigned unique ID for this managed resource.
- name String
- The authorization parameter name (descriptor ID).
- parameters
List<Get
Serviceendpoint Type Parameter> - A list of parameter descriptors. Each element has:
- ui
Contribution StringId - The UI contribution ID for this service endpoint type.
- String
- authentication
Schemes string[] - A list of available authentication schemes for this service endpoint type.
-
Get
Serviceendpoint Type Authorization Parameter[] - A list of authorization parameter descriptors. Only populated when
authorizationSchemeis provided. Each element has: - description string
- The description of the service endpoint type.
- display
Name string - The display name of the service endpoint type.
- id string
- The provider-assigned unique ID for this managed resource.
- name string
- The authorization parameter name (descriptor ID).
- parameters
Get
Serviceendpoint Type Parameter[] - A list of parameter descriptors. Each element has:
- ui
Contribution stringId - The UI contribution ID for this service endpoint type.
- string
- authentication_
schemes Sequence[str] - A list of available authentication schemes for this service endpoint type.
-
Sequence[Get
Serviceendpoint Type Authorization Parameter] - A list of authorization parameter descriptors. Only populated when
authorizationSchemeis provided. Each element has: - description str
- The description of the service endpoint type.
- display_
name str - The display name of the service endpoint type.
- id str
- The provider-assigned unique ID for this managed resource.
- name str
- The authorization parameter name (descriptor ID).
- parameters
Sequence[Get
Serviceendpoint Type Parameter] - A list of parameter descriptors. Each element has:
- ui_
contribution_ strid - The UI contribution ID for this service endpoint type.
- str
- authentication
Schemes List<String> - A list of available authentication schemes for this service endpoint type.
- List<Property Map>
- A list of authorization parameter descriptors. Only populated when
authorizationSchemeis provided. Each element has: - description String
- The description of the service endpoint type.
- display
Name String - The display name of the service endpoint type.
- id String
- The provider-assigned unique ID for this managed resource.
- name String
- The authorization parameter name (descriptor ID).
- parameters List<Property Map>
- A list of parameter descriptors. Each element has:
- ui
Contribution StringId - The UI contribution ID for this service endpoint type.
- String
Supporting Types
GetServiceendpointTypeAuthorizationParameter
- Default
Value string - The default value for this parameter, if provided by the API.
- Name string
- The name of the service endpoint type to query.
- Possible
Values List<string> - A list of possible values for this parameter, if provided by the API.
- Default
Value string - The default value for this parameter, if provided by the API.
- Name string
- The name of the service endpoint type to query.
- Possible
Values []string - A list of possible values for this parameter, if provided by the API.
- default_
value string - The default value for this parameter, if provided by the API.
- name string
- The name of the service endpoint type to query.
- possible_
values list(string) - A list of possible values for this parameter, if provided by the API.
- default
Value String - The default value for this parameter, if provided by the API.
- name String
- The name of the service endpoint type to query.
- possible
Values List<String> - A list of possible values for this parameter, if provided by the API.
- default
Value string - The default value for this parameter, if provided by the API.
- name string
- The name of the service endpoint type to query.
- possible
Values string[] - A list of possible values for this parameter, if provided by the API.
- default_
value str - The default value for this parameter, if provided by the API.
- name str
- The name of the service endpoint type to query.
- possible_
values Sequence[str] - A list of possible values for this parameter, if provided by the API.
- default
Value String - The default value for this parameter, if provided by the API.
- name String
- The name of the service endpoint type to query.
- possible
Values List<String> - A list of possible values for this parameter, if provided by the API.
GetServiceendpointTypeParameter
- Default
Value string - The default value for this parameter, if provided by the API.
- Name string
- The name of the service endpoint type to query.
- Possible
Values List<string> - A list of possible values for this parameter, if provided by the API.
- Default
Value string - The default value for this parameter, if provided by the API.
- Name string
- The name of the service endpoint type to query.
- Possible
Values []string - A list of possible values for this parameter, if provided by the API.
- default_
value string - The default value for this parameter, if provided by the API.
- name string
- The name of the service endpoint type to query.
- possible_
values list(string) - A list of possible values for this parameter, if provided by the API.
- default
Value String - The default value for this parameter, if provided by the API.
- name String
- The name of the service endpoint type to query.
- possible
Values List<String> - A list of possible values for this parameter, if provided by the API.
- default
Value string - The default value for this parameter, if provided by the API.
- name string
- The name of the service endpoint type to query.
- possible
Values string[] - A list of possible values for this parameter, if provided by the API.
- default_
value str - The default value for this parameter, if provided by the API.
- name str
- The name of the service endpoint type to query.
- possible_
values Sequence[str] - A list of possible values for this parameter, if provided by the API.
- default
Value String - The default value for this parameter, if provided by the API.
- name String
- The name of the service endpoint type to query.
- possible
Values List<String> - A list of possible values for this parameter, if provided by the API.
Package Details
- Repository
- Azure DevOps pulumi/pulumi-azuredevops
- License
- Apache-2.0
- Notes
- This Pulumi package is based on the
azuredevopsTerraform Provider.
Viewing docs for Azure DevOps v3.16.0
published on Friday, Jul 17, 2026 by Pulumi
published on Friday, Jul 17, 2026 by Pulumi