Skip to content

Commit b87c28d

Browse files
author
damccorm
authored
Added policy sample (#225)
* Added policy sample * Responding to feedback * Added structure for creating/deleting project for running samples * Integrated auto-created project in policy example * Responding to feedback * Fixed small issue with sample project deletion
1 parent d898d85 commit b87c28d

4 files changed

Lines changed: 149 additions & 1 deletion

File tree

samples/policy.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import * as common from './common';
2+
import * as nodeApi from 'azure-devops-node-api';
3+
4+
import * as PolicyApi from 'azure-devops-node-api/PolicyApi';
5+
import * as PolicyInterfaces from 'azure-devops-node-api/interfaces/PolicyInterfaces';
6+
import * as VSSInterfaces from 'azure-devops-node-api/interfaces/common/VSSInterfaces';
7+
8+
export async function run(projectId: string) {
9+
const webApi: nodeApi.WebApi = await common.getWebApi();
10+
const policyApiObject: PolicyApi.IPolicyApi = await webApi.getPolicyApi();
11+
12+
common.banner('Policy Samples');
13+
14+
common.heading('Create Policy Configuration for this Project');
15+
const newConfiguration: PolicyInterfaces.PolicyConfiguration = {isEnabled: true,
16+
isBlocking: false,
17+
type: {
18+
id: "fa4e907d-c16b-4a4c-9dfa-4906e5d171dd",
19+
displayName: undefined,
20+
url: undefined
21+
},
22+
settings: {
23+
minimumApproverCount: 1,
24+
creatorVoteCounts: false,
25+
scope: [{
26+
repositoryId: null,
27+
refName: "refs/heads/master",
28+
matchKind: "exact"
29+
}]},
30+
_links: undefined,
31+
createdBy: undefined,
32+
createdDate: undefined,
33+
isDeleted: undefined,
34+
revision: undefined,
35+
id: undefined,
36+
url: undefined
37+
};
38+
await policyApiObject.createPolicyConfiguration(newConfiguration, projectId);
39+
40+
common.heading("Get Policy Configurations for this Project");
41+
const configurations: PolicyInterfaces.PolicyConfiguration[] = await policyApiObject.getPolicyConfigurations(projectId);
42+
const firstConfig: PolicyInterfaces.PolicyConfiguration = configurations[0];
43+
const creatorIdentity: VSSInterfaces.IdentityRef = firstConfig.createdBy;
44+
console.log("Configuration created by", creatorIdentity.displayName);
45+
46+
common.heading("Get revisions for this configuration");
47+
const revisions: PolicyInterfaces.PolicyConfiguration[] = await policyApiObject.getPolicyConfigurationRevisions(projectId, firstConfig.id);
48+
console.log("Revisions:", revisions);
49+
50+
common.heading("Get Policy Types for this Project");
51+
const policies: PolicyInterfaces.PolicyType[] = await policyApiObject.getPolicyTypes(projectId);
52+
console.log("Policy Types:", policies);
53+
54+
common.heading('Delete Policy Configuration');
55+
await policyApiObject.deletePolicyConfiguration(projectId, firstConfig.id);
56+
const deletedConfiguration: PolicyInterfaces.PolicyConfiguration = await policyApiObject.getPolicyConfiguration(projectId, firstConfig.id);
57+
if (deletedConfiguration.isDeleted) {
58+
console.log('Policy configuration successfully deleted');
59+
}
60+
else {
61+
console.log('Unable to delete policy');
62+
}
63+
}

samples/run.ts

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44
// export export API_TOKEN=<yourAllScopesApiToken>
55
// export API_PROJECT=test
66
import * as cm from './common';
7+
import * as nodeApi from 'azure-devops-node-api';
8+
import * as cApi from 'azure-devops-node-api/CoreApi';
9+
import * as coreInterfaces from 'azure-devops-node-api/interfaces/CoreInterfaces'
710

811
let samples: string[] = require('./samples.json');
12+
let coreApi: cApi.ICoreApi;
13+
const maxLoops: number = 500;
914

1015
let selection: string = process.argv[2];
1116
if (selection) {
@@ -17,7 +22,77 @@ if (selection) {
1722
samples = [selection];
1823
}
1924

25+
async function createProject(projectId: string): Promise<boolean> {
26+
console.log('Cleaning up from last run');
27+
if (!(await deleteProject(projectId))) {
28+
console.log('Failed to delete previous project');
29+
return false;
30+
}
31+
32+
const projectToCreate: coreInterfaces.TeamProject = {name: projectId,
33+
description: 'sample project created automatically by azure-devops-node-api.',
34+
visibility: 1,
35+
capabilities: {versioncontrol: {sourceControlType: 'Git'},
36+
processTemplate: {templateTypeId: '6b724908-ef14-45cf-84f8-768b5384da45'}},
37+
_links: null,
38+
defaultTeam: null,
39+
abbreviation: null,
40+
id: null,
41+
revision: null,
42+
state: null,
43+
url: null};
44+
await coreApi.queueCreateProject(projectToCreate);
45+
46+
//Poll until project exists
47+
let project: coreInterfaces.TeamProject = null;
48+
console.log('Waiting for project to spin up');
49+
let numLoops = 0;
50+
while (numLoops < maxLoops) {
51+
project = await coreApi.getProject(projectId);
52+
numLoops += 1;
53+
if (project) {
54+
return true;
55+
}
56+
}
57+
return false;
58+
}
59+
60+
async function deleteProject(projectId: string): Promise<boolean> {
61+
let project: coreInterfaces.TeamProject = await coreApi.getProject(projectId);
62+
if (!project) {
63+
//If no project to clean up, just return
64+
console.log("Nothing to clean up");
65+
return true;
66+
}
67+
await coreApi.queueDeleteProject(project.id);
68+
69+
//Poll until project no longer exists
70+
console.log('Waiting for project to be deleted');
71+
let numLoops = 0;
72+
while (project && numLoops < maxLoops) {
73+
project = await coreApi.getProject(projectId);
74+
numLoops += 1;
75+
if (!project) {
76+
return true;
77+
}
78+
}
79+
return false;
80+
}
81+
2082
async function runSamples(selected?: string) {
83+
const webApi: nodeApi.WebApi = await cm.getWebApi();
84+
coreApi = await webApi.getCoreApi();
85+
const projectId: string = 'azureDevopsNodeSampleProject';
86+
87+
cm.heading('Creating example project');
88+
if (await createProject(projectId)) {
89+
console.log('Project created');
90+
}
91+
else {
92+
console.log('Failed to create project, exiting');
93+
return;
94+
}
95+
2196
for (let i: number = 0; i < samples.length; i++) {
2297
let sample: string = samples[i];
2398

@@ -27,7 +102,15 @@ async function runSamples(selected?: string) {
27102

28103
cm.banner('Sample ' + sample);
29104
var sm = require('./' + sample + '.js');
30-
await sm.run();
105+
await sm.run(projectId);
106+
}
107+
108+
cm.heading('Cleaning up project');
109+
if (await deleteProject(projectId)) {
110+
console.log('Done');
111+
}
112+
else {
113+
console.log('Failed to delete project');
31114
}
32115
}
33116

samples/samples.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"build",
33
"buildArtifact",
44
"creation",
5+
"policy",
56
"task",
67
"filecontainer",
78
"git",

samples/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"build.ts",
1010
"buildArtifact.ts",
1111
"creation.ts",
12+
"policy.ts",
1213
"task.ts",
1314
"filecontainer.ts",
1415
"git.ts",

0 commit comments

Comments
 (0)