@@ -5,6 +5,9 @@ var _ = require('lodash');
55var common = require ( '../utils/common' ) ;
66var factory = require ( '../utils/factory' ) ;
77var AppError = require ( '../app-error' ) ;
8+ var config = require ( '../config' ) ;
9+ var log4js = require ( 'log4js' ) ;
10+ var log = log4js . getLogger ( "cps:ClientManager" ) ;
811
912var proto = module . exports = function ( ) {
1013 function ClientManager ( ) {
@@ -15,6 +18,7 @@ var proto = module.exports = function (){
1518} ;
1619
1720const UPDATE_CHECK = "UPDATE_CHECK" ;
21+ const CHOSEN_MAN = "CHOSEN_MAN" ;
1822const EXPIRED = 600 ;
1923
2024proto . getUpdateCheckCacheKey = function ( deploymentKey , appVersion , label , packageHash ) {
@@ -37,9 +41,9 @@ proto.clearUpdateCheckCache = function(deploymentKey, appVersion, label, package
3741 . finally ( ( ) => client . quit ( ) ) ;
3842}
3943
40- proto . updateCheckFromCache = function ( deploymentKey , appVersion , label , packageHash ) {
44+ proto . updateCheckFromCache = function ( deploymentKey , appVersion , label , packageHash , clientUniqueId ) {
4145 const self = this ;
42- var updateCheckCache = _ . get ( require ( '../ config' ) , 'common.updateCheckCache' , false ) ;
46+ var updateCheckCache = _ . get ( config , 'common.updateCheckCache' , false ) ;
4347 if ( updateCheckCache === false ) {
4448 return self . updateCheck ( deploymentKey , appVersion , label , packageHash ) ;
4549 }
@@ -49,14 +53,16 @@ proto.updateCheckFromCache = function(deploymentKey, appVersion, label, packageH
4953 . then ( ( data ) => {
5054 if ( data ) {
5155 try {
56+ log . debug ( 'updateCheckFromCache read from catch' ) ;
5257 var obj = JSON . parse ( data ) ;
5358 return obj ;
5459 } catch ( e ) {
5560 }
5661 }
57- return self . updateCheck ( deploymentKey , appVersion , label , packageHash )
62+ return self . updateCheck ( deploymentKey , appVersion , label , packageHash , clientUniqueId )
5863 . then ( ( rs ) => {
5964 try {
65+ log . debug ( 'updateCheckFromCache read from db' ) ;
6066 var strRs = JSON . stringify ( rs ) ;
6167 client . setexAsync ( redisCacheKey , EXPIRED , strRs ) ;
6268 } catch ( e ) {
@@ -67,7 +73,51 @@ proto.updateCheckFromCache = function(deploymentKey, appVersion, label, packageH
6773 . finally ( ( ) => client . quit ( ) ) ;
6874}
6975
70- proto . updateCheck = function ( deploymentKey , appVersion , label , packageHash ) {
76+ proto . getChosenManCacheKey = function ( deploymentKey , appVersion , clientUniqueId , rollout ) {
77+ return [ CHOSEN_MAN , deploymentKey , appVersion , clientUniqueId , rollout ] . join ( ':' ) ;
78+ }
79+
80+ proto . random = function ( rollout ) {
81+ var r = Math . ceil ( Math . random ( ) * 10000 ) ;
82+ if ( r < rollout * 100 ) {
83+ return Promise . resolve ( true ) ;
84+ } else {
85+ return Promise . resolve ( false ) ;
86+ }
87+ }
88+
89+ proto . chosenMan = function ( rollout , deploymentKey , appVersion , clientUniqueId ) {
90+ var self = this ;
91+ if ( rollout >= 100 ) {
92+ return Promise . resolve ( true ) ;
93+ }
94+ var rolloutClientUniqueIdCache = _ . get ( config , 'common.rolloutClientUniqueIdCache' , false ) ;
95+ if ( rolloutClientUniqueIdCache === false ) {
96+ return self . random ( rollout ) ;
97+ } else {
98+ var client = factory . getRedisClient ( "default" ) ;
99+ var redisCacheKey = self . getChosenManCacheKey ( deploymentKey , appVersion , clientUniqueId , rollout ) ;
100+ return client . getAsync ( redisCacheKey )
101+ . then ( ( data ) => {
102+ if ( data == 1 ) {
103+ return true ;
104+ } else if ( data == 2 ) {
105+ return false ;
106+ } else {
107+ return self . random ( rollout )
108+ . then ( ( r ) => {
109+ return client . setexAsync ( redisCacheKey , 60 * 60 * 24 * 7 , r ? 1 :2 )
110+ . then ( ( ) => {
111+ return r ;
112+ } ) ;
113+ } ) ;
114+ }
115+ } )
116+ . finally ( ( ) => client . quit ( ) ) ;
117+ }
118+ }
119+
120+ proto . updateCheck = function ( deploymentKey , appVersion , label , packageHash , clientUniqueId ) {
71121 var rs = {
72122 downloadURL : "" ,
73123 downloadUrl : "" ,
@@ -79,15 +129,17 @@ proto.updateCheck = function(deploymentKey, appVersion, label, packageHash) {
79129 label : "" ,
80130 packageSize : 0 ,
81131 updateAppVersion : false ,
82- shouldRunBinaryVersion : false
132+ shouldRunBinaryVersion : false ,
133+ rollout : 100
83134 } ;
135+ var self = this ;
84136 if ( _ . isEmpty ( deploymentKey ) || _ . isEmpty ( appVersion ) ) {
85137 return Promise . reject ( new AppError . AppError ( "please input deploymentKey and appVersion" ) )
86138 }
87139 return models . Deployments . findOne ( { where : { deployment_key : deploymentKey } } )
88140 . then ( ( dep ) => {
89141 if ( _ . isEmpty ( dep ) ) {
90- throw new AppError . AppError ( 'does not found deployment' ) ;
142+ throw new AppError . AppError ( 'Not found deployment, check deployment key is right. ' ) ;
91143 }
92144 return models . DeploymentsVersions . findOne ( { where : { deployment_id : dep . id , app_version : appVersion } } ) ;
93145 } )
@@ -101,22 +153,20 @@ proto.updateCheck = function(deploymentKey, appVersion, label, packageHash) {
101153 if ( packages
102154 && _ . eq ( packages . deployment_id , deploymentsVersions . deployment_id )
103155 && ! _ . eq ( packages . package_hash , packageHash ) ) {
104- rs . downloadURL = common . getBlobDownloadUrl ( _ . get ( packages , 'blob_url' ) ) ;
105- rs . downloadUrl = common . getBlobDownloadUrl ( _ . get ( packages , 'blob_url' ) ) ;
156+ rs . downloadUrl = rs . downloadURL = common . getBlobDownloadUrl ( _ . get ( packages , 'blob_url' ) ) ;
106157 rs . description = _ . get ( packages , 'description' , '' ) ;
107- rs . isAvailable = true ;
158+ rs . isAvailable = _ . eq ( packages . is_disabled , 1 ) ? false : true ;
108159 rs . isMandatory = _ . eq ( packages . is_mandatory , 1 ) ? true : false ;
109160 rs . appVersion = appVersion ;
110161 rs . packageHash = _ . get ( packages , 'package_hash' , '' ) ;
111162 rs . label = _ . get ( packages , 'label' , '' ) ;
112163 rs . packageSize = _ . get ( packages , 'size' , 0 ) ;
113- rs . shouldRunBinaryVersion = false ;
164+ rs . rollout = _ . get ( packages , 'rollout' , 100 ) ;
114165 }
115166 return packages ;
116167 } )
117-
118168 . then ( ( packages ) => {
119- //差异化更新
169+ //增量更新
120170 if ( ! _ . isEmpty ( packages ) && ! _ . eq ( _ . get ( packages , 'package_hash' , "" ) , packageHash ) ) {
121171 return models . PackagesDiff . findOne ( { where : { package_id :packages . id , diff_against_package_hash : packageHash } } )
122172 . then ( ( diffPackage ) => {
@@ -159,24 +209,45 @@ proto.getPackagesInfo = function (deploymentKey, label) {
159209proto . reportStatusDownload = function ( deploymentKey , label , clientUniqueId ) {
160210 return this . getPackagesInfo ( deploymentKey , label )
161211 . then ( ( packages ) => {
162- return models . PackagesMetrics . addOneOnDownloadById ( packages . id ) ;
212+ return Promise . all ( [
213+ models . PackagesMetrics . addOneOnDownloadById ( packages . id ) ,
214+ models . LogReportDownload . create ( {
215+ package_id : packages . id ,
216+ client_unique_id : clientUniqueId
217+ } )
218+ ] ) ;
163219 } ) ;
164220} ;
165221
166222proto . reportStatusDeploy = function ( deploymentKey , label , clientUniqueId , others ) {
167223 return this . getPackagesInfo ( deploymentKey , label )
168224 . then ( ( packages ) => {
225+ var constConfig = require ( '../const' ) ;
169226 var status = _ . get ( others , "status" ) ;
170227 var packageId = packages . id ;
171228 if ( _ . eq ( status , "DeploymentSucceeded" ) ) {
172229 return Promise . all ( [
230+ models . LogReportDeploy . create ( {
231+ package_id : packageId ,
232+ client_unique_id : clientUniqueId ,
233+ previous_label : _ . get ( others , 'previousLabelOrAppVersion' ) ,
234+ previous_deployment_key : _ . get ( others , 'previousDeploymentKey' ) ,
235+ status : constConfig . DEPLOYMENT_SUCCEEDED
236+ } ) ,
173237 models . PackagesMetrics . addOneOnInstalledById ( packageId ) ,
174238 models . PackagesMetrics . addOneOnActiveById ( packageId ) ,
175239 ] ) ;
176240 } else if ( _ . eq ( status , "DeploymentFailed" ) ) {
177241 return Promise . all ( [
242+ models . LogReportDeploy . create ( {
243+ package_id : packageId ,
244+ client_unique_id : clientUniqueId ,
245+ previous_label : _ . get ( others , 'previousLabelOrAppVersion' ) ,
246+ previous_deployment_key : _ . get ( others , 'previousDeploymentKey' ) ,
247+ status : constConfig . DEPLOYMENT_FAILED
248+ } ) ,
178249 models . PackagesMetrics . addOneOnInstalledById ( packageId ) ,
179- models . PackagesMetrics . addOneOnFailedById ( packageId )
250+ models . PackagesMetrics . addOneOnFailedById ( packageId ) ,
180251 ] ) ;
181252 } else {
182253 return ;
0 commit comments