diff --git a/app/scripts/app.ts b/app/scripts/app.ts index 8bfa59a60dd..3cf7e7aac30 100644 --- a/app/scripts/app.ts +++ b/app/scripts/app.ts @@ -12,14 +12,13 @@ import { ORACLE_MODULE } from '@spinnaker/oracle'; import { KAYENTA_MODULE } from '@spinnaker/kayenta'; import { TITUS_MODULE } from '@spinnaker/titus'; import { ECS_MODULE } from '@spinnaker/ecs'; -import { CLOUD_FOUNDRY_MODULE } from '@spinnaker/cloudfoundry'; +import '@spinnaker/cloudfoundry'; module('netflix.spinnaker', [ CORE_MODULE, AMAZON_MODULE, GOOGLE_MODULE, ECS_MODULE, - CLOUD_FOUNDRY_MODULE, require('./modules/azure/azure.module').name, KUBERNETES_V1_MODULE, DOCKER_MODULE, diff --git a/app/scripts/modules/cloudfoundry/src/cf.module.ts b/app/scripts/modules/cloudfoundry/src/cf.module.ts index a64f139de27..17cf7b8bcc1 100644 --- a/app/scripts/modules/cloudfoundry/src/cf.module.ts +++ b/app/scripts/modules/cloudfoundry/src/cf.module.ts @@ -1,29 +1,32 @@ -import { module } from 'angular'; - import { CloudProviderRegistry } from '@spinnaker/core'; -import { CLOUD_FOUNDRY_LOAD_BALANCER_MODULE } from './loadBalancer/loadBalancer.module'; -import { CLOUD_FOUNDRY_REACT_MODULE } from './reactShims/cf.react.module'; -import { CLOUD_FOUNDRY_SERVER_GROUP_TRANSFORMER } from './serverGroup/serverGroup.transformer'; -import { CLOUD_FOUNDRY_SERVER_GROUP_COMMAND_BUILDER } from './serverGroup/configure/serverGroupCommandBuilder.service.cf'; -import { CLOUD_FOUNDRY_SEARCH_FORMATTER } from './search/searchResultFormatter'; import './help/cloudfoundry.help'; +import './logo/cf.logo.less'; + +import { + CloudFoundryLoadBalancerDetails, + CloudFoundryLoadBalancerTransformer, + CloudFoundryNoLoadBalancerModal, +} from 'cloudfoundry/loadBalancer'; import { - ServerGroupInformationSection, ApplicationManagerSection, - MetricsSection, - ServerGroupSizingSection, - HealthCheckSection, - PackageSection, BoundServicesSection, + cfServerGroupDetailsGetter, + CloudFoundryCreateServerGroupModal, + CloudFoundryServerGroupActions, + CloudFoundryServerGroupCommandBuilder, + CloudFoundryServerGroupTransformer, EvironmentVariablesSection, + HealthCheckSection, + MetricsSection, + PackageSection, + ServerGroupInformationSection, + ServerGroupSizingSection, } from 'cloudfoundry/serverGroup'; -import { CloudFoundryServerGroupActions } from './serverGroup/details/cloudFoundryServerGroupActions'; -import { cfServerGroupDetailsGetter } from './serverGroup/details/cfServerGroupDetailsGetter'; -import './logo/cf.logo.less'; -import { CloudFoundryNoLoadBalancerModal } from './loadBalancer/configure/cloudFoundryNoLoadBalancerModal'; +import { CloudFoundryInstanceDetails } from 'cloudfoundry/instance/details'; + import 'cloudfoundry/pipeline/config/validation/cfTargetImpedance.validator'; import 'cloudfoundry/pipeline/config/validation/instanceSize.validator'; import 'cloudfoundry/pipeline/config/validation/requiredRoutes.validator'; @@ -41,60 +44,37 @@ import './pipeline/stages/rollbackCluster/cloudfoundryRollbackClusterStage.modul import './pipeline/stages/shareService/cloudfoundryShareServiceStage.module'; import './pipeline/stages/unmapLoadBalancers/cloudfoundryUnmapLoadBalancersStage.module'; import './pipeline/stages/unshareService/cloudfoundryUnshareServiceStage.module'; -import { CloudFoundryCreateServerGroupModal } from 'cloudfoundry/serverGroup/configure/wizard/CreateServerGroupModal'; -import { CLOUD_FOUNDRY_INSTANCE_DETAILS } from 'cloudfoundry/instance/details/cloudfoundryInstanceDetails.module'; - -// load all templates into the $templateCache -const templates = require.context('./', true, /\.html$/); -templates.keys().forEach(function(key) { - templates(key); -}); -export const CLOUD_FOUNDRY_MODULE = 'spinnaker.cloudfoundry'; -module(CLOUD_FOUNDRY_MODULE, [ - CLOUD_FOUNDRY_INSTANCE_DETAILS, - CLOUD_FOUNDRY_LOAD_BALANCER_MODULE, - CLOUD_FOUNDRY_REACT_MODULE, - CLOUD_FOUNDRY_SEARCH_FORMATTER, - CLOUD_FOUNDRY_SERVER_GROUP_COMMAND_BUILDER, - CLOUD_FOUNDRY_SERVER_GROUP_TRANSFORMER, -]).config(() => { - CloudProviderRegistry.registerProvider('cloudfoundry', { - name: 'Cloud Foundry', - logo: { - path: require('./logo/cf.logo.svg'), - }, - loadBalancer: { - transformer: 'cfLoadBalancerTransformer', - detailsTemplateUrl: require('./loadBalancer/details/cloudFoundryLoadBalancerDetails.html'), - detailsController: 'cloudfoundryLoadBalancerDetailsCtrl', - CreateLoadBalancerModal: CloudFoundryNoLoadBalancerModal, - }, - serverGroup: { - skipUpstreamStageCheck: true, - transformer: 'cfServerGroupTransformer', - detailsActions: CloudFoundryServerGroupActions, - detailsGetter: cfServerGroupDetailsGetter, - detailsSections: [ - ServerGroupInformationSection, - ApplicationManagerSection, - MetricsSection, - ServerGroupSizingSection, - HealthCheckSection, - PackageSection, - BoundServicesSection, - EvironmentVariablesSection, - ], - CloneServerGroupModal: CloudFoundryCreateServerGroupModal, - commandBuilder: 'cfServerGroupCommandBuilder', - scalingActivitiesEnabled: false, // FIXME enable? - }, - search: { - resultFormatter: 'cfSearchResultFormatter', - }, - instance: { - detailsTemplateUrl: require('./instance/details/cloudFoundryInstanceDetails.html'), - detailsController: 'cfInstanceDetailsCtrl', - }, - }); +CloudProviderRegistry.registerProvider('cloudfoundry', { + name: 'Cloud Foundry', + logo: { + path: require('./logo/cf.logo.svg'), + }, + loadBalancer: { + transformer: CloudFoundryLoadBalancerTransformer, + details: CloudFoundryLoadBalancerDetails, + CreateLoadBalancerModal: CloudFoundryNoLoadBalancerModal, + }, + serverGroup: { + skipUpstreamStageCheck: true, + transformer: CloudFoundryServerGroupTransformer, + detailsActions: CloudFoundryServerGroupActions, + detailsGetter: cfServerGroupDetailsGetter, + detailsSections: [ + ServerGroupInformationSection, + ApplicationManagerSection, + MetricsSection, + ServerGroupSizingSection, + HealthCheckSection, + PackageSection, + BoundServicesSection, + EvironmentVariablesSection, + ], + CloneServerGroupModal: CloudFoundryCreateServerGroupModal, + commandBuilder: CloudFoundryServerGroupCommandBuilder, + scalingActivitiesEnabled: false, // FIXME enable? + }, + instance: { + details: CloudFoundryInstanceDetails, + }, }); diff --git a/app/scripts/modules/cloudfoundry/src/index.ts b/app/scripts/modules/cloudfoundry/src/index.ts index 4ad42e18e4f..c0a0f92cfcf 100644 --- a/app/scripts/modules/cloudfoundry/src/index.ts +++ b/app/scripts/modules/cloudfoundry/src/index.ts @@ -1,8 +1,7 @@ -export { CLOUD_FOUNDRY_MODULE } from './cf.module'; +export * from './cf.module'; export * from './cf.settings'; export * from './domain/index'; export * from './loadBalancer/index'; export * from './presentation/index'; -export * from './reactShims/index'; export * from './serverGroup/index'; diff --git a/app/scripts/modules/cloudfoundry/src/instance/details/CloudFoundryInstanceDetails.tsx b/app/scripts/modules/cloudfoundry/src/instance/details/CloudFoundryInstanceDetails.tsx index 3be99582186..880f6248679 100644 --- a/app/scripts/modules/cloudfoundry/src/instance/details/CloudFoundryInstanceDetails.tsx +++ b/app/scripts/modules/cloudfoundry/src/instance/details/CloudFoundryInstanceDetails.tsx @@ -2,29 +2,104 @@ import * as React from 'react'; import { UISref } from '@uirouter/react'; import { UIRouterContext } from '@uirouter/react-hybrid'; -import { Application, ConfirmationModalService, InstanceWriter, Spinner } from '@spinnaker/core'; +import { + Application, + ConfirmationModalService, + InstanceReader, + InstanceWriter, + RecentHistoryService, + Spinner, +} from '@spinnaker/core'; import { ICloudFoundryInstance } from 'cloudfoundry/domain'; import { CloudFoundryInstanceDetailsSection } from 'cloudfoundry/instance/details/sections'; import { CloudFoundryInstanceActions } from 'cloudfoundry/instance/details/CloudFoundryInstanceActions'; +import { flattenDeep } from 'lodash'; -export interface ICloudFoundryInstanceDetailsProps { - application: Application; - confirmationModalService: ConfirmationModalService; - instance: ICloudFoundryInstance; +interface InstanceFromStateParams { + instanceId: string; +} + +interface InstanceManager { + account: string; + region: string; + category: string; // e.g., serverGroup, loadBalancer. + name: string; // Parent resource name, not instance name. + instances: ICloudFoundryInstance[]; +} + +interface ICloudFoundryInstanceDetailsState { + instance?: ICloudFoundryInstance; instanceIdNotFound: string; + loading: boolean; +} + +interface ICloudFoundryInstanceDetailsProps { + app: Application; + confirmationModalService: ConfirmationModalService; + instance: InstanceFromStateParams; instanceWriter: InstanceWriter; loading: boolean; } @UIRouterContext -export class CloudFoundryInstanceDetails extends React.Component { +export class CloudFoundryInstanceDetails extends React.Component< + ICloudFoundryInstanceDetailsProps, + ICloudFoundryInstanceDetailsState +> { constructor(props: ICloudFoundryInstanceDetailsProps) { super(props); + + this.state = { + loading: true, + instanceIdNotFound: props.instance.instanceId, + }; + } + + public componentDidMount(): void { + this.props.app.ready().then(() => this.retrieveInstance(this.props.instance)); + } + + private retrieveInstance(instanceFromParams: InstanceFromStateParams): void { + const instanceLocatorPredicate = (dataSource: InstanceManager) => { + return dataSource.instances.some(possibleMatch => possibleMatch.id === instanceFromParams.instanceId); + }; + + const dataSources: InstanceManager[] = flattenDeep([ + this.props.app.getDataSource('serverGroups').data, + this.props.app.getDataSource('loadBalancers').data, + this.props.app.getDataSource('loadBalancers').data.map(loadBalancer => loadBalancer.serverGroups), + ]); + + const instanceManager = dataSources.find(instanceLocatorPredicate); + + if (instanceManager) { + const recentHistoryExtraData: { [key: string]: string } = { + region: instanceManager.region, + account: instanceManager.account, + }; + if (instanceManager.category === 'serverGroup') { + recentHistoryExtraData.serverGroup = instanceManager.name; + } + RecentHistoryService.addExtraDataToLatest('instances', recentHistoryExtraData); + InstanceReader.getInstanceDetails(instanceManager.account, instanceManager.region, instanceFromParams.instanceId) + .then((instanceDetails: ICloudFoundryInstance) => { + instanceDetails.account = instanceManager.account; + instanceDetails.region = instanceManager.region; + return instanceDetails; + }) + .then(instance => { + this.setState({ + instance, + loading: false, + }); + }); + } } public render(): JSX.Element { - const { application, confirmationModalService, instance, instanceIdNotFound, instanceWriter, loading } = this.props; + const { app, confirmationModalService, instanceWriter } = this.props; + const { instance, instanceIdNotFound, loading } = this.state; const CloseButton = (
@@ -56,7 +131,7 @@ export class CloudFoundryInstanceDetails extends React.Component{instance.name}
diff --git a/app/scripts/modules/cloudfoundry/src/instance/details/cloudfoundryInstanceDetails.module.ts b/app/scripts/modules/cloudfoundry/src/instance/details/cloudfoundryInstanceDetails.module.ts deleted file mode 100644 index e060e40989f..00000000000 --- a/app/scripts/modules/cloudfoundry/src/instance/details/cloudfoundryInstanceDetails.module.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { IController, IPromise, IQService, IScope, module } from 'angular'; -import { react2angular } from 'react2angular'; - -import { CloudFoundryInstanceDetails } from './CloudFoundryInstanceDetails'; -import { - Application, - ConfirmationModalService, - InstanceReader, - InstanceWriter, - RecentHistoryService, -} from '@spinnaker/core'; -import { ICloudFoundryInstance } from 'cloudfoundry/domain'; -import { flattenDeep } from 'lodash'; - -interface InstanceFromStateParams { - instanceId: string; -} - -interface InstanceManager { - account: string; - region: string; - category: string; // e.g., serverGroup, loadBalancer. - name: string; // Parent resource name, not instance name. - instances: ICloudFoundryInstance[]; -} - -class CloudFoundryInstanceDetailsCtrl implements IController { - public static $inject = ['$scope', 'app', 'instance', 'instanceWriter', 'confirmationModalService', '$q']; - constructor( - public $scope: IScope, - private app: Application, - private instance: InstanceFromStateParams, - private instanceWriter: InstanceWriter, - private confirmationModalService: ConfirmationModalService, - private $q: IQService, - ) { - this.$scope.application = this.app; - this.$scope.instanceWriter = this.instanceWriter; - this.$scope.confirmationModalService = this.confirmationModalService; - this.$scope.qService = this.$q; - this.$scope.loading = true; - this.app - .ready() - .then(() => this.retrieveInstance(this.instance)) - .then(instanceDetails => { - this.$scope.instance = instanceDetails; - this.$scope.loading = false; - }) - .catch(() => { - this.$scope.instanceIdNotFound = this.instance.instanceId; - this.$scope.loading = false; - }); - } - private retrieveInstance(instance: InstanceFromStateParams): IPromise { - const instanceLocatorPredicate = (dataSource: InstanceManager) => { - return dataSource.instances.some(possibleMatch => possibleMatch.id === instance.instanceId); - }; - - const dataSources: InstanceManager[] = flattenDeep([ - this.app.getDataSource('serverGroups').data, - this.app.getDataSource('loadBalancers').data, - this.app.getDataSource('loadBalancers').data.map(loadBalancer => loadBalancer.serverGroups), - ]); - - const instanceManager = dataSources.find(instanceLocatorPredicate); - - if (instanceManager) { - const recentHistoryExtraData: { [key: string]: string } = { - region: instanceManager.region, - account: instanceManager.account, - }; - if (instanceManager.category === 'serverGroup') { - recentHistoryExtraData.serverGroup = instanceManager.name; - } - RecentHistoryService.addExtraDataToLatest('instances', recentHistoryExtraData); - - return InstanceReader.getInstanceDetails( - instanceManager.account, - instanceManager.region, - instance.instanceId, - ).then((instanceDetails: ICloudFoundryInstance) => { - instanceDetails.account = instanceManager.account; - instanceDetails.region = instanceManager.region; - return instanceDetails; - }); - } else { - return this.$q.reject(); - } - } -} - -export const CLOUD_FOUNDRY_INSTANCE_DETAILS = 'spinnaker.cloudfoundry.instanceDetails'; -module(CLOUD_FOUNDRY_INSTANCE_DETAILS, []) - .component( - 'cfInstanceDetails', - react2angular(CloudFoundryInstanceDetails, [ - 'application', - 'confirmationModalService', - 'instance', - 'instanceIdNotFound', - 'instanceWriter', - 'loading', - ]), - ) - .controller('cfInstanceDetailsCtrl', CloudFoundryInstanceDetailsCtrl); diff --git a/app/scripts/modules/cloudfoundry/src/loadBalancer/details/CloudFoundryLoadBalancerDetails.tsx b/app/scripts/modules/cloudfoundry/src/loadBalancer/details/CloudFoundryLoadBalancerDetails.tsx index 84ed73505ec..c8022cbbf41 100644 --- a/app/scripts/modules/cloudfoundry/src/loadBalancer/details/CloudFoundryLoadBalancerDetails.tsx +++ b/app/scripts/modules/cloudfoundry/src/loadBalancer/details/CloudFoundryLoadBalancerDetails.tsx @@ -9,23 +9,81 @@ import { ICloudFoundryLoadBalancer } from 'cloudfoundry/domain'; import { CloudFoundryLoadBalancerStatusSection } from 'cloudfoundry/loadBalancer/details/sections/CloudFoundryLoadBalancerStatusSection'; import { CloudFoundryLoadBalancerLinksSection } from 'cloudfoundry/loadBalancer/details/sections/CloudFoundryLoadBalancerLinksSection'; +interface ILoadBalancer { + name: string; + accountId: string; + region: string; +} + +interface ICloudFoundryLoadBalancerDetailsState { + loadBalancer: ICloudFoundryLoadBalancer; + loadBalancerNotFound?: string; + loading: boolean; + refreshListenerUnsubscribe: () => void; +} + export interface ICloudFoundryLoadBalancerDetailsProps { - application: Application; + app: Application; confirmationModalService: ConfirmationModalService; - loadBalancer: ICloudFoundryLoadBalancer; - loadBalancerNotFound: string; + loadBalancer: ILoadBalancer; loadBalancerWriter: LoadBalancerWriter; - loading: boolean; } @UIRouterContext -export class CloudFoundryLoadBalancerDetails extends React.Component { +export class CloudFoundryLoadBalancerDetails extends React.Component< + ICloudFoundryLoadBalancerDetailsProps, + ICloudFoundryLoadBalancerDetailsState +> { constructor(props: ICloudFoundryLoadBalancerDetailsProps) { super(props); + this.state = { + loading: true, + loadBalancer: undefined, + refreshListenerUnsubscribe: () => {}, + }; + + props.app + .getDataSource('loadBalancers') + .ready() + .then(() => this.extractLoadBalancer()); + } + + public componentWillUnmount(): void { + this.state.refreshListenerUnsubscribe(); + } + + private extractLoadBalancer(): void { + const { name } = this.props.loadBalancer; + const loadBalancer: ICloudFoundryLoadBalancer = this.props.app + .getDataSource('loadBalancers') + .data.find((test: ICloudFoundryLoadBalancer) => { + return test.name === name && test.account === this.props.loadBalancer.accountId; + }); + + this.setState({ + loading: false, + loadBalancer, + }); + + this.state.refreshListenerUnsubscribe(); + + if (loadBalancer) { + this.setState({ + refreshListenerUnsubscribe: this.props.app + .getDataSource('loadBalancers') + .onRefresh(null, () => this.extractLoadBalancer()), + }); + } else { + this.setState({ + refreshListenerUnsubscribe: () => {}, + }); + // this.autoClose(); + } } public render(): JSX.Element { - const { application, confirmationModalService, loadBalancer, loadBalancerNotFound, loading } = this.props; + const { app, confirmationModalService } = this.props; + const { loadBalancer, loadBalancerNotFound, loading } = this.state; const CloseButton = (
@@ -58,7 +116,7 @@ export class CloudFoundryLoadBalancerDetails extends React.Component{loadBalancer.name}
@@ -83,8 +141,8 @@ export class CloudFoundryLoadBalancerDetails extends React.Component {loading && loadingHeader()} - {!loading && loadBalancer && loadBalancerHeader()} - {!loading && loadBalancer && loadBalancerContent()} + {!loading && !!loadBalancer && loadBalancerHeader()} + {!loading && !!loadBalancer && loadBalancerContent()} {!loading && !loadBalancer && notFoundHeader()} {!loading && !loadBalancer && notFoundContent()} diff --git a/app/scripts/modules/cloudfoundry/src/loadBalancer/details/cloudFoundryLoadBalancerDetails.html b/app/scripts/modules/cloudfoundry/src/loadBalancer/details/cloudFoundryLoadBalancerDetails.html deleted file mode 100644 index 2ad09b9de0a..00000000000 --- a/app/scripts/modules/cloudfoundry/src/loadBalancer/details/cloudFoundryLoadBalancerDetails.html +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/app/scripts/modules/cloudfoundry/src/loadBalancer/details/cloudFoundryLoadBalancerDetails.module.ts b/app/scripts/modules/cloudfoundry/src/loadBalancer/details/cloudFoundryLoadBalancerDetails.module.ts deleted file mode 100644 index 51aecf5485a..00000000000 --- a/app/scripts/modules/cloudfoundry/src/loadBalancer/details/cloudFoundryLoadBalancerDetails.module.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { IController, IQService, IScope, module } from 'angular'; -import { react2angular } from 'react2angular'; - -import { CloudFoundryLoadBalancerDetails } from './CloudFoundryLoadBalancerDetails'; -import { Application, ConfirmationModalService, ILoadBalancer } from '@spinnaker/core'; - -import { ICloudFoundryLoadBalancer } from 'cloudfoundry/domain'; - -interface ILoadBalancerFromStateParams { - accountId: string; - name: string; - region: string; -} - -class CloudFoundryLoadBalancerDetailsCtrl implements IController { - private loadBalancerFromParams: ILoadBalancerFromStateParams; - public loadBalancer: ICloudFoundryLoadBalancer; - - public static $inject = ['$scope', 'app', 'confirmationModalService', 'loadBalancer', '$q']; - constructor( - public $scope: IScope, - private app: Application, - private confirmationModalService: ConfirmationModalService, - loadBalancer: ILoadBalancerFromStateParams, - private $q: IQService, - ) { - this.$scope.application = this.app; - this.$scope.confirmationModalService = this.confirmationModalService; - this.$scope.loading = true; - this.$scope.qService = this.$q; - this.loadBalancerFromParams = loadBalancer; - this.app - .getDataSource('loadBalancers') - .ready() - .then(() => this.extractLoadBalancer()); - } - - private extractLoadBalancer(): void { - this.$scope.loadBalancer = this.app.getDataSource('loadBalancers').data.find((test: ILoadBalancer) => { - return test.name === this.loadBalancerFromParams.name && test.account === this.loadBalancerFromParams.accountId; - }) as ICloudFoundryLoadBalancer; - if (this.$scope.loadBalancer) { - this.$scope.loading = false; - this.app.getDataSource('loadBalancers').onRefresh(this.$scope, () => this.extractLoadBalancer()); - } else { - this.$scope.loadBalancerNotFound = this.loadBalancerFromParams.name; - this.$scope.loading = false; - this.autoClose(); - } - } - - private autoClose(): void { - if (this.$scope.$$destroyed) { - return; - } else { - this.$scope.params.allowModalToStayOpen = true; - } - } -} - -export const CLOUD_FOUNDRY_LOAD_BALANCER_DETAILS = 'spinnaker.cloudfoundry.loadBalancerDetails'; -module(CLOUD_FOUNDRY_LOAD_BALANCER_DETAILS, []) - .component( - 'cfLoadBalancerDetails', - react2angular(CloudFoundryLoadBalancerDetails, [ - 'application', - 'confirmationModalService', - 'loadBalancer', - 'loadBalancerNotFound', - 'loading', - ]), - ) - .controller('cloudfoundryLoadBalancerDetailsCtrl', CloudFoundryLoadBalancerDetailsCtrl); diff --git a/app/scripts/modules/cloudfoundry/src/loadBalancer/index.ts b/app/scripts/modules/cloudfoundry/src/loadBalancer/index.ts index f3fe8810802..91ec0805382 100644 --- a/app/scripts/modules/cloudfoundry/src/loadBalancer/index.ts +++ b/app/scripts/modules/cloudfoundry/src/loadBalancer/index.ts @@ -1 +1,3 @@ export * from './loadBalancer.transformer'; +export * from './details'; +export * from './configure/cloudFoundryNoLoadBalancerModal'; diff --git a/app/scripts/modules/cloudfoundry/src/loadBalancer/loadBalancer.module.ts b/app/scripts/modules/cloudfoundry/src/loadBalancer/loadBalancer.module.ts deleted file mode 100644 index 6b14511194f..00000000000 --- a/app/scripts/modules/cloudfoundry/src/loadBalancer/loadBalancer.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { module } from 'angular'; - -import { CLOUD_FOUNDRY_LOAD_BALANCER_DETAILS } from './details/cloudFoundryLoadBalancerDetails.module'; -import { CLOUD_FOUNDRY_LOAD_BALANCER_TRANSFORMER } from './loadBalancer.transformer'; - -export const CLOUD_FOUNDRY_LOAD_BALANCER_MODULE = 'spinnaker.cloudfoundry.loadBalancer.module'; - -module(CLOUD_FOUNDRY_LOAD_BALANCER_MODULE, [ - CLOUD_FOUNDRY_LOAD_BALANCER_DETAILS, - CLOUD_FOUNDRY_LOAD_BALANCER_TRANSFORMER, -]); diff --git a/app/scripts/modules/cloudfoundry/src/loadBalancer/loadBalancer.transformer.ts b/app/scripts/modules/cloudfoundry/src/loadBalancer/loadBalancer.transformer.ts index 53550d19e5e..7af462bd536 100644 --- a/app/scripts/modules/cloudfoundry/src/loadBalancer/loadBalancer.transformer.ts +++ b/app/scripts/modules/cloudfoundry/src/loadBalancer/loadBalancer.transformer.ts @@ -1,5 +1,3 @@ -import { module } from 'angular'; - import { camelCase, chain, cloneDeep, get, has } from 'lodash'; import { @@ -150,10 +148,3 @@ export class CloudFoundryLoadBalancerTransformer { return instance as IInstance; } } - -export const CLOUD_FOUNDRY_LOAD_BALANCER_TRANSFORMER = 'spinnaker.cloudfoundry.loadBalancer.transformer.service'; - -module(CLOUD_FOUNDRY_LOAD_BALANCER_TRANSFORMER, []).service( - 'cfLoadBalancerTransformer', - CloudFoundryLoadBalancerTransformer, -); diff --git a/app/scripts/modules/cloudfoundry/src/search/searchResultFormatter.ts b/app/scripts/modules/cloudfoundry/src/search/searchResultFormatter.ts deleted file mode 100644 index 285c1acb43a..00000000000 --- a/app/scripts/modules/cloudfoundry/src/search/searchResultFormatter.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { module } from 'angular'; - -export interface ICloudFoundryServerGroupSearchResult { - serverGroup: string; - region: string; -} - -export class CloudFoundrySearchFormatter { - public static serverGroups(serverGroup: ICloudFoundryServerGroupSearchResult) { - const [org, space] = serverGroup.region.split('_'); - return `${serverGroup.serverGroup} (${org}/${space})`; - } -} - -export const CLOUD_FOUNDRY_SEARCH_FORMATTER = 'spinnaker.cloudfoundry.search.searchResultFormatter'; - -module(CLOUD_FOUNDRY_SEARCH_FORMATTER, []).service('cfSearchResultFormatter', CloudFoundrySearchFormatter); diff --git a/app/scripts/modules/cloudfoundry/src/serverGroup/configure/index.ts b/app/scripts/modules/cloudfoundry/src/serverGroup/configure/index.ts index 08b78735748..1740215fe97 100644 --- a/app/scripts/modules/cloudfoundry/src/serverGroup/configure/index.ts +++ b/app/scripts/modules/cloudfoundry/src/serverGroup/configure/index.ts @@ -1 +1,3 @@ export * from './serverGroupConfigurationModel.cf'; +export * from './serverGroupCommandBuilder.service.cf'; +export * from './wizard/CreateServerGroupModal'; diff --git a/app/scripts/modules/cloudfoundry/src/serverGroup/configure/serverGroupCommandBuilder.service.cf.ts b/app/scripts/modules/cloudfoundry/src/serverGroup/configure/serverGroupCommandBuilder.service.cf.ts index 24e5ad73b84..70970923cc1 100644 --- a/app/scripts/modules/cloudfoundry/src/serverGroup/configure/serverGroupCommandBuilder.service.cf.ts +++ b/app/scripts/modules/cloudfoundry/src/serverGroup/configure/serverGroupCommandBuilder.service.cf.ts @@ -1,4 +1,4 @@ -import { IPromise, IQService, module } from 'angular'; +import { IPromise, IQService } from 'angular'; import { IStage, IPipeline, Application } from '@spinnaker/core'; @@ -9,6 +9,7 @@ import { } from './serverGroupConfigurationModel.cf'; export class CloudFoundryServerGroupCommandBuilder { + // TODO: Remove? public static buildUpdateServerGroupCommand(_originalServerGroup: any) { throw new Error('Implement me!'); } @@ -171,10 +172,3 @@ export class CloudFoundryServerGroupCommandBuilder { }); } } - -export const CLOUD_FOUNDRY_SERVER_GROUP_COMMAND_BUILDER = 'spinnaker.cloudfoundry.serverGroupCommandBuilder.service'; - -module(CLOUD_FOUNDRY_SERVER_GROUP_COMMAND_BUILDER, []).service( - 'cfServerGroupCommandBuilder', - CloudFoundryServerGroupCommandBuilder, -); diff --git a/app/scripts/modules/cloudfoundry/src/serverGroup/index.ts b/app/scripts/modules/cloudfoundry/src/serverGroup/index.ts index 3e3c74b62f5..034772fdea5 100644 --- a/app/scripts/modules/cloudfoundry/src/serverGroup/index.ts +++ b/app/scripts/modules/cloudfoundry/src/serverGroup/index.ts @@ -1,2 +1,5 @@ export * from './details/sections/index'; export * from './configure/'; +export * from './serverGroup.transformer'; +export * from './details/cloudFoundryServerGroupActions'; +export * from './details/cfServerGroupDetailsGetter'; diff --git a/app/scripts/modules/cloudfoundry/src/serverGroup/serverGroup.transformer.ts b/app/scripts/modules/cloudfoundry/src/serverGroup/serverGroup.transformer.ts index 31d8713131c..29425c15b9b 100644 --- a/app/scripts/modules/cloudfoundry/src/serverGroup/serverGroup.transformer.ts +++ b/app/scripts/modules/cloudfoundry/src/serverGroup/serverGroup.transformer.ts @@ -1,4 +1,4 @@ -import { module, IPromise } from 'angular'; +import { IPromise } from 'angular'; import { defaults } from 'lodash'; @@ -42,9 +42,3 @@ export class CloudFoundryServerGroupTransformer { return newEnv; } } - -export const CLOUD_FOUNDRY_SERVER_GROUP_TRANSFORMER = 'spinnaker.cloudfoundry.serverGroup.transformer'; -module(CLOUD_FOUNDRY_SERVER_GROUP_TRANSFORMER, []).service( - 'cfServerGroupTransformer', - CloudFoundryServerGroupTransformer, -); diff --git a/app/scripts/modules/core/src/cloudProvider/providerService.delegate.ts b/app/scripts/modules/core/src/cloudProvider/providerService.delegate.ts index 8958c189124..745e9c5f096 100644 --- a/app/scripts/modules/core/src/cloudProvider/providerService.delegate.ts +++ b/app/scripts/modules/core/src/cloudProvider/providerService.delegate.ts @@ -1,4 +1,4 @@ -import { module } from 'angular'; +import { IQService, module } from 'angular'; import { isString, isFunction } from 'lodash'; import IInjectorService = angular.auto.IInjectorService; @@ -6,12 +6,12 @@ import IInjectorService = angular.auto.IInjectorService; import { CloudProviderRegistry } from './CloudProviderRegistry'; export class ProviderServiceDelegate { - public static $inject = ['$injector']; - constructor(private $injector: IInjectorService) {} + public static $inject = ['$injector', '$q']; + constructor(private $injector: IInjectorService, private $q: IQService) {} public hasDelegate(provider: string, serviceKey: string, skin?: string): boolean { const service: string = CloudProviderRegistry.getValue(provider, serviceKey, skin); - return this.$injector.has(service); + return isFunction(service) || (isString(service) && this.$injector.has(service)); } public getDelegate(provider: string, serviceKey: string, skin?: string): T { @@ -21,7 +21,8 @@ export class ProviderServiceDelegate { return this.$injector.get(service, 'providerDelegate'); } else if (isFunction(service)) { // service is a Function, assume it's service class, so new() it - return new service(); + // Inject $q in case it is required for resolving promises in a possibly non-Angular component + return new service(this.$q); } else { throw new Error('No "' + serviceKey + '" service found for provider "' + provider + '"'); }