├── .buckconfig ├── .eslintrc ├── .flowconfig ├── .gitattributes ├── .gitignore ├── .prettierrc.js ├── .watchmanconfig ├── App.js ├── README.md ├── __tests__ ├── Button.test.js ├── Image.test.js ├── Launch.test.js ├── SignOut.test.js ├── Text.test.js ├── TouchableOpacity.test.js └── __snapshots__ │ ├── Button.test.js.snap │ ├── Image.test.js.snap │ ├── Launch.test.js.snap │ ├── SignOut.test.js.snap │ ├── Text.test.js.snap │ └── TouchableOpacity.test.js.snap ├── android ├── app │ ├── _BUCK │ ├── build.gradle │ ├── build_defs.bzl │ ├── debug.keystore │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── shipm8 │ │ │ ├── MainActivity.java │ │ │ └── MainApplication.java │ │ └── res │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── app.json ├── babel.config.js ├── index.js ├── ios ├── Podfile ├── Podfile.lock ├── ShipM8.xcodeproj │ └── project.pbxproj ├── ShipM8Tests │ ├── Info.plist │ └── shipm8Tests.m ├── shipm8-tvOS │ └── Info.plist ├── shipm8-tvOSTests │ └── Info.plist ├── shipm8.xcworkspace │ └── contents.xcworkspacedata └── shipm8 │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ └── LaunchScreen.xib │ ├── Images.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── SHIPM8_LogoNew 120x120-1.png │ │ ├── SHIPM8_LogoNew 120x120.png │ │ ├── SHIPM8_LogoNew 180x180.png │ │ ├── SHIPM8_LogoNew 40x40.png │ │ ├── SHIPM8_LogoNew 58x58.png │ │ ├── SHIPM8_LogoNew 60x60.png │ │ ├── SHIPM8_LogoNew 80x80.png │ │ ├── SHIPM8_LogoNew 87x87.png │ │ └── SHIPM8_LogoNew.png │ ├── Contents.json │ ├── shipm8.imageset │ │ ├── Contents.json │ │ └── shipm8.png │ └── shipm8_logo.imageset │ │ ├── Contents.json │ │ └── shipm8_logo.png │ ├── Info.plist │ └── main.m ├── metro.config.js ├── package-lock.json ├── package.json ├── src ├── api │ ├── AwsApi.js │ ├── GoogleCloudApi.js │ └── K8sApi.js ├── assets │ ├── aws_logo.png │ ├── google.png │ ├── googleCloud.png │ ├── pod.png │ ├── shipm8.png │ ├── shipm8_logo.png │ ├── shipm8_logo_unused.png │ └── trash.png ├── components │ ├── Clusters │ │ ├── AddCluster.js │ │ └── ClustersIndex.js │ ├── Pods │ │ ├── PodInfo.js │ │ └── PodsDisplay.js │ └── common │ │ ├── CloudLogin.js │ │ ├── EntityStatus.js │ │ ├── Loading.js │ │ ├── SwipeableList.js │ │ └── Welcome.js ├── data │ ├── CloudProviders.js │ ├── FakeData.js │ └── Regions.js ├── navigation │ └── Routes.js ├── reducers │ ├── AwsSlice.js │ ├── ClustersSlice.js │ ├── GoogleCloudSlice.js │ ├── PodsSlice.js │ └── index.js ├── store │ └── configureStore.js └── utils │ ├── AlertUtils.js │ ├── LoadingUtils.js │ ├── StatusUtils.js │ └── aws4.js └── yarn.lock /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends": "@react-native-community", 4 | "rules": { 5 | "prettier/prettier": 0, 6 | "react-hooks/rules-of-hooks": "error", 7 | "react-hooks/exhaustive-deps": "warn" 8 | }, 9 | "plugins": [ 10 | "react", 11 | "react-hooks" 12 | ] 13 | } -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore polyfills 9 | node_modules/react-native/Libraries/polyfills/.* 10 | 11 | ; These should not be required directly 12 | ; require from fbjs/lib instead: require('fbjs/lib/warning') 13 | node_modules/warning/.* 14 | 15 | ; Flow doesn't support platforms 16 | .*/Libraries/Utilities/LoadingView.js 17 | 18 | [untyped] 19 | .*/node_modules/@react-native-community/cli/.*/.* 20 | 21 | [include] 22 | 23 | [libs] 24 | node_modules/react-native/Libraries/react-native/react-native-interface.js 25 | node_modules/react-native/flow/ 26 | 27 | [options] 28 | emoji=true 29 | 30 | esproposal.optional_chaining=enable 31 | esproposal.nullish_coalescing=enable 32 | 33 | module.file_ext=.js 34 | module.file_ext=.json 35 | module.file_ext=.ios.js 36 | 37 | munge_underscores=true 38 | 39 | module.name_mapper='^react-native$' -> '/node_modules/react-native/Libraries/react-native/react-native-implementation' 40 | module.name_mapper='^react-native/\(.*\)$' -> '/node_modules/react-native/\1' 41 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> '/node_modules/react-native/Libraries/Image/RelativeImageStub' 42 | 43 | suppress_type=$FlowIssue 44 | suppress_type=$FlowFixMe 45 | suppress_type=$FlowFixMeProps 46 | suppress_type=$FlowFixMeState 47 | 48 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\) 49 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)?:? #[0-9]+ 50 | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError 51 | 52 | [lints] 53 | sketchy-null-number=warn 54 | sketchy-null-mixed=warn 55 | sketchy-number=warn 56 | untyped-type-import=warn 57 | nonstrict-import=warn 58 | deprecated-type=warn 59 | unsafe-getters-setters=warn 60 | inexact-spread=warn 61 | unnecessary-invariant=warn 62 | signature-verification-failure=warn 63 | deprecated-utility=error 64 | 65 | [strict] 66 | deprecated-type 67 | nonstrict-import 68 | sketchy-null 69 | unclear-type 70 | unsafe-getters-setters 71 | untyped-import 72 | untyped-type-import 73 | 74 | [version] 75 | ^0.105.0 76 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | *.xcscmblueprint 8 | build/ 9 | *.pbxuser 10 | !default.pbxuser 11 | *.mode1v3 12 | !default.mode1v3 13 | *.mode2v3 14 | !default.mode2v3 15 | *.perspectivev3 16 | !default.perspectivev3 17 | xcuserdata 18 | *.xccheckout 19 | *.moved-aside 20 | DerivedData 21 | *.hmap 22 | *.ipa 23 | *.xcuserstate 24 | project.xcworkspace 25 | xcshareddata/ 26 | 27 | # Android/IntelliJ 28 | # 29 | build/ 30 | .idea 31 | .gradle 32 | local.properties 33 | *.iml 34 | 35 | # node.js 36 | # 37 | node_modules/ 38 | npm-debug.log 39 | yarn-error.log 40 | 41 | # BUCK 42 | buck-out/ 43 | \.buckd/ 44 | *.keystore 45 | !debug.keystore 46 | 47 | # fastlane 48 | # 49 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 50 | # screenshots whenever they are needed. 51 | # For more information about the recommended setup visit: 52 | # https://docs.fastlane.tools/best-practices/source-control/ 53 | 54 | */fastlane/report.xml 55 | */fastlane/Preview.html 56 | */fastlane/screenshots 57 | 58 | # Bundle artifact 59 | *.jsbundle 60 | 61 | # CocoaPods 62 | /ios/Pods/ -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | bracketSpacing: true, 3 | jsxBracketSameLine: true, 4 | singleQuote: true, 5 | trailingComma: 'all', 6 | }; 7 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /App.js: -------------------------------------------------------------------------------- 1 | import 'react-native-gesture-handler'; 2 | import React from 'react'; 3 | import { StatusBar } from 'react-native'; 4 | import { Provider } from 'react-redux'; 5 | import { store, persistor } from './src/store/configureStore'; 6 | import { PersistGate } from 'redux-persist/integration/react'; 7 | import { NavigationContainer } from '@react-navigation/native'; 8 | 9 | import Loading from './src/components/common/Loading'; 10 | import Routes from './src/navigation/Routes'; 11 | 12 | const App = () => { 13 | return ( 14 | 15 | 16 | } persistor={persistor}> 17 | 18 | 19 | 20 | 21 | 22 | ); 23 | }; 24 | 25 | export default App; 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ShipM8, the mobile app for monitoring Kubernetes 2 | 3 | ShipM8 is a mobile application for Kubernetes with support for AWS EKS deployments. 4 | 5 | ShipM8 is made with [React Native](https://facebook.github.io/react-native/). For [development](#run-locally-using-simulators) purposes you can run the application using both iOS and Android simulators. 6 | 7 | ## To get started with development (iOS) 8 | 9 | To develop and test the application you need to setup your local environment, then run the simulator. 10 | You'll need the React Native CLI, Xcode, and Cocoapods. Be sure you have Xcode installed (at least version 11.3.1). 11 | 12 | Once you have Xcode properly installed 13 | 14 | Install `react-native-cli` 15 | 16 | ```npm install -g react-native-cli``` 17 | 18 | With `react-native-cli` installed 19 | 20 | ```npm install``` 21 | 22 | Next, install `cocoapods` if you have not already 23 | 24 | ```sudo gem install cocoapods``` 25 | 26 | Install iOS dependencies 27 | 28 | ```cd iOS/ && pod install``` 29 | 30 | Finally, cd back to main project directory and run the app on iOS 31 | 32 | ```npm run ios``` 33 | 34 | # Limitations 35 | 36 | These regions are not currently supported: 37 | [Northern California, Hong Kong, Frankfurt, Bahrain] -------------------------------------------------------------------------------- /__tests__/Button.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Button } from 'react-native'; 3 | 4 | // Note: test renderer must be required after react-native. 5 | import renderer from 'react-test-renderer'; 6 | 7 | describe('Button', () => { 8 | it('renders correctly', () => { 9 | const buttonTest = renderer 10 | .create(