Skip to content

Commit

Permalink
feat(provider/aws): Functions (listing and searching) (#7536)
Browse files Browse the repository at this point in the history
* .

* feat(provider/aws): Function listing and searching functionality

This change adds a new tab for functions and facilitates listing existing functions and searching functions listed.
Corresponding provider specific changes are included in this change for AWS.

Authors: @sidmuls and @nabebe

* feat(provider/aws): Function listing and searching functionality

This change adds a new tab for functions and facilitates listing existing functions and searching functions listed.
Corresponding provider specific changes are included in this change for AWS.

Authors: @sidmuls and @nabebe

* refactor(provider/aws): Converting Function class component into function component.

This is a refactoring change as requested by reviewer @caseyhebebrand

Author: @sidmuls

* refactor(provider/aws): Refactoring groupings into a separate component.

This change is for refactoring requested by reviewer @caseyhebebrand.

Author: @sidmuls

* refactor(provider/aws): Removing unnecessary state from FunctionGroupings.

This change is a refactoring requested by @caseyhebebrand

Author: @sidmuls

*  refactor(provider/aws): removing extra line. Tthis is actually for retrying tests on TravisCI

* refactor(provider/aws): Adding tests for FunctionFilterService and changes as requested by @christopherthielen

Author: @sidmuls

* refactor(provider/aws): removing unnecessary field from IFunction
  • Loading branch information
sidmuls authored and mergify[bot] committed Oct 25, 2019
1 parent 6236a9f commit 86a365b
Show file tree
Hide file tree
Showing 29 changed files with 1,195 additions and 6 deletions.
7 changes: 6 additions & 1 deletion app/scripts/modules/amazon/src/aws.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { module } from 'angular';
import { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';

import { AWS_LOAD_BALANCER_MODULE } from './loadBalancer/loadBalancer.module';
import { AWS_FUNCTION_MODULE } from './function/function.module';
import { AWS_REACT_MODULE } from './reactShims/aws.react.module';
import { AWS_SECURITY_GROUP_MODULE } from './securityGroup/securityGroup.module';
import { AWS_SERVER_GROUP_TRANSFORMER } from './serverGroup/serverGroup.transformer';
Expand All @@ -17,7 +18,7 @@ import { AwsImageReader } from './image';
import { AmazonLoadBalancerClusterContainer } from './loadBalancer/AmazonLoadBalancerClusterContainer';
import { AmazonLoadBalancersTag } from './loadBalancer/AmazonLoadBalancersTag';
import { AwsLoadBalancerTransformer } from './loadBalancer/loadBalancer.transformer';

import { AwsFunctionTransformer } from './function/function.transformer';
import './deploymentStrategy/rollingPush.strategy';

import './logo/aws.logo.less';
Expand Down Expand Up @@ -73,6 +74,7 @@ module(AMAZON_MODULE, [
AWS_SERVER_GROUP_TRANSFORMER,
require('./instance/awsInstanceType.service').name,
AWS_LOAD_BALANCER_MODULE,
AWS_FUNCTION_MODULE,
require('./instance/details/instance.details.controller').name,
AWS_SECURITY_GROUP_MODULE,
SUBNET_RENDERER,
Expand Down Expand Up @@ -127,6 +129,9 @@ module(AMAZON_MODULE, [
ClusterContainer: AmazonLoadBalancerClusterContainer,
LoadBalancersTag: AmazonLoadBalancersTag,
},
function: {
transformer: AwsFunctionTransformer,
},
securityGroup: {
transformer: 'awsSecurityGroupTransformer',
reader: 'awsSecurityGroupReader',
Expand Down
29 changes: 29 additions & 0 deletions app/scripts/modules/amazon/src/domain/IAmazonFunction.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { IFunction } from '@spinnaker/core';

export interface IAmazonFunction extends IFunction {
credentials?: string;
role?: string;
runtime: string;
s3bucket: string;
s3key: string;
handler: string;
functionName: string;
publish: boolean;
description: string;
tags: [{}];
memorySize: number;
timeout: number;
envVariables: {};
tracingConfig: {
mode: string;
};
deadLetterConfig: {
targetArn: string;
};
KMSKeyArn: string;
vpcConfig: {
securityGroupIds: [];
subnetIds: [];
vpcId: string;
};
}
1 change: 1 addition & 0 deletions app/scripts/modules/amazon/src/domain/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export * from './IAmazonCertificate';
export * from './IAmazonInstance';
export * from './IAmazonLoadBalancer';
export * from './IAmazonFunction';
export * from './IAmazonLoadBalancerSourceData';
export * from './IAmazonHealth';
export * from './IAmazonScalingPolicy';
Expand Down
5 changes: 5 additions & 0 deletions app/scripts/modules/amazon/src/function/function.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { module } from 'angular';

export const AWS_FUNCTION_MODULE = 'spinnaker.amazon.function';

module(AWS_FUNCTION_MODULE, []);
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { IAmazonFunction } from 'amazon/domain';

export class AwsFunctionTransformer {
public normalizeFunction(functionDef: IAmazonFunction): IAmazonFunction {
return functionDef;
}
}
1 change: 1 addition & 0 deletions app/scripts/modules/amazon/src/function/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './function.transformer';
1 change: 1 addition & 0 deletions app/scripts/modules/amazon/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export * from './common';
export * from './domain';
export * from './keyPairs';
export * from './loadBalancer';
export * from './function';
export * from './reactShims';
export * from './serverGroup';
export * from './templates';
Expand Down
4 changes: 2 additions & 2 deletions app/scripts/modules/core/src/core.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ import { INSIGHT_MODULE } from './insight/insight.module';
import { INTERCEPTOR_MODULE } from './interceptor/interceptor.module';
import { LOAD_BALANCER_MODULE } from './loadBalancer/loadBalancer.module';
import { MANAGED_RESOURCE_CONFIG } from './application/config/managedResources/ManagedResourceConfig';

import { FUNCTION_MODULE } from './function/function.module';
import { NETWORK_INTERCEPTOR } from './api/network.interceptor';

import { PAGE_TITLE_MODULE } from './pageTitle/pageTitle.module';
Expand Down Expand Up @@ -114,7 +114,7 @@ module(CORE_MODULE, [

LABEL_FILTER_COMPONENT,
LOAD_BALANCER_MODULE,

FUNCTION_MODULE,
MANAGED_RESOURCE_CONFIG,
require('./modal/modal.module').name,

Expand Down
27 changes: 27 additions & 0 deletions app/scripts/modules/core/src/domain/IFunction.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { ITaggedEntity } from './ITaggedEntity';

export interface IFunctionSourceData {
cloudProvider?: string;
name?: string;
provider?: string;
type?: string;
}

export interface IFunction extends ITaggedEntity {
account?: string;
cloudProvider?: string;
description?: string;
functionName?: string;
region?: string;
searchField?: string;
type?: string;
vpcId?: string;
vpcName?: string;
}

export interface IFunctionGroup {
heading: string;
functionDef?: IFunction;
subgroups?: IFunctionGroup[];
searchField?: string;
}
2 changes: 1 addition & 1 deletion app/scripts/modules/core/src/domain/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export * from './IExecution';
export * from './IExecutionStage';
export * from './IExecutionTrigger';
export * from './IExpectedArtifact';

export * from './IFunction';
export * from './IHealth';

export * from './IInstance';
Expand Down
25 changes: 24 additions & 1 deletion app/scripts/modules/core/src/entityTag/EntityTagsReader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,15 @@ import { $q } from 'ngimport';
import { API } from 'core/api/ApiService';
import { IEntityTags, IEntityTag, ICreationMetadataTag } from '../domain/IEntityTags';
import { Application } from 'core/application/application.model';
import { IExecution, IPipeline, IServerGroup, IServerGroupManager, ILoadBalancer, ISecurityGroup } from 'core/domain';
import {
IExecution,
IPipeline,
IServerGroup,
IServerGroupManager,
ILoadBalancer,
ISecurityGroup,
IFunction,
} from 'core/domain';
import { SETTINGS } from 'core/config/settings';

export class EntityTagsReader {
Expand Down Expand Up @@ -71,6 +79,21 @@ export class EntityTagsReader {
});
}

public static addTagsToFunctions(application: Application): void {
if (!SETTINGS.feature.entityTags) {
return;
}
const allTags = application.getDataSource('entityTags').data;
const functionTags: IEntityTags[] = allTags.filter(t => t.entityRef.entityType === 'function');
application.getDataSource('functions').data.forEach((fn: IFunction) => {
fn.entityTags = functionTags.find(
t =>
t.entityRef.entityId === fn.functionName &&
t.entityRef.account === fn.account &&
t.entityRef.region === fn.region,
);
});
}
public static addTagsToSecurityGroups(application: Application): void {
if (!SETTINGS.feature.entityTags) {
return;
Expand Down
46 changes: 46 additions & 0 deletions app/scripts/modules/core/src/function/Function.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import * as React from 'react';
import { UISref, UISrefActive } from '@uirouter/react';
import { Application } from 'core/application/application.model';
import { IFunction } from 'core/domain';
import { EntityNotifications } from 'core/entityTag/notifications/EntityNotifications';

interface IFunctionProps {
application: Application;
functionDef: IFunction;
}

const Function = (props: IFunctionProps) => {
const { application, functionDef } = props;
const params = {
application: application.name,
region: functionDef.region,
account: functionDef.account,
name: functionDef.functionName,
provider: functionDef.cloudProvider,
};
return (
<div className="pod-subgroup function">
<div className="function-header sticky-header-2">
<UISrefActive class="active">
<UISref to=".functionDetails" params={params}>
<h6 className="clickable clickable-row horizontal middle">
<i className="fa icon-sitemap" />
&nbsp; {(functionDef.region || '').toUpperCase()}
<div className="flex-1">
<EntityNotifications
entity={functionDef}
application={application}
placement="bottom"
entityType="function"
pageLocation="pod"
onUpdate={() => application.functions.refresh()}
/>
</div>
</h6>
</UISref>
</UISrefActive>
</div>
</div>
);
};
export default Function;
11 changes: 11 additions & 0 deletions app/scripts/modules/core/src/function/FunctionDetails.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import * as React from 'react';
import { Overridable, IOverridableProps } from 'core/overrideRegistry';

export interface IFunctionDetailsProps extends IOverridableProps {}

@Overridable('function.details')
export class FunctionDetails extends React.Component<IFunctionDetailsProps> {
public render() {
return <h3>Function Details</h3>;
}
}
33 changes: 33 additions & 0 deletions app/scripts/modules/core/src/function/FunctionGroupings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import * as React from 'react';
import { Application } from '@spinnaker/core';
import { IFunctionGroup } from 'core/domain';
import { FunctionPod } from './FunctionPod';

export interface IFunctionGroupingsProps {
app: Application;
groups: IFunctionGroup[];
}
export class FunctionGroupings extends React.Component<IFunctionGroupingsProps> {
constructor(props: IFunctionGroupingsProps) {
super(props);
}
public render() {
return (
<div>
{this.props.groups.map(group => (
<div key={group.heading} className="rollup">
{group.subgroups &&
group.subgroups.map(subgroup => (
<FunctionPod
key={subgroup.heading}
grouping={subgroup}
application={this.props.app}
parentHeading={group.heading}
/>
))}
</div>
))}
</div>
);
}
}
39 changes: 39 additions & 0 deletions app/scripts/modules/core/src/function/FunctionPod.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import * as React from 'react';

import { AccountTag } from 'core/account';
import { Application } from 'core/application/application.model';
import { IFunctionGroup } from 'core/domain';
import Function from './Function';

import './functionPod.less';

export interface IFunctionPodProps {
grouping: IFunctionGroup;
application: Application;
parentHeading: string;
}

export class FunctionPod extends React.Component<IFunctionPodProps> {
public render(): React.ReactElement<FunctionPod> {
const { grouping, application, parentHeading } = this.props;
const subgroups = grouping.subgroups.map(subgroup => (
<Function key={subgroup.functionDef.functionName} application={application} functionDef={subgroup.functionDef} />
));

return (
<div className="load-balancer-pod row rollup-entry sub-group">
<div className="rollup-summary sticky-header">
<div className="rollup-title-cell">
<div className="heading-tag">
<AccountTag account={parentHeading} />
</div>
<div className="pod-center horizontal space-between center flex-1">
<div>{grouping.heading}</div>
</div>
</div>
</div>
<div className="rollup-details">{subgroups}</div>
</div>
);
}
}
Loading

0 comments on commit 86a365b

Please sign in to comment.